blob: afd8c43121e6e7e50c0cad9c7673232fae04679f [file] [log] [blame]
Lang Hamesbe9af122012-10-02 04:45:10 +00001// RUN: %clang_cc1 -O3 -emit-llvm -o - %s | FileCheck %s
2
3// Is FP_CONTRACT is honored in a simple case?
4float fp_contract_1(float a, float b, float c) {
5// CHECK: _Z13fp_contract_1fff
NAKAMURA Takumi438daee2012-10-02 16:36:54 +00006// CHECK: tail call float @llvm.fmuladd
Lang Hamesbe9af122012-10-02 04:45:10 +00007 #pragma STDC FP_CONTRACT ON
8 return a * b + c;
9}
10
11// Is FP_CONTRACT state cleared on exiting compound statements?
12float fp_contract_2(float a, float b, float c) {
13// CHECK: _Z13fp_contract_2fff
NAKAMURA Takumi438daee2012-10-02 16:36:54 +000014// CHECK: %[[M:.+]] = fmul float %a, %b
15// CHECK-NEXT: fadd float %[[M]], %c
Lang Hamesbe9af122012-10-02 04:45:10 +000016 {
17 #pragma STDC FP_CONTRACT ON
18 }
19 return a * b + c;
20}
21
22// Does FP_CONTRACT survive template instatiation?
23class Foo {};
24Foo operator+(Foo, Foo);
25
26template <typename T>
27T template_muladd(T a, T b, T c) {
28 #pragma STDC FP_CONTRACT ON
29 return a * b + c;
30}
31
32float fp_contract_3(float a, float b, float c) {
33// CHECK: _Z13fp_contract_3fff
NAKAMURA Takumi438daee2012-10-02 16:36:54 +000034// CHECK: tail call float @llvm.fmuladd
Lang Hamesbe9af122012-10-02 04:45:10 +000035 return template_muladd<float>(a, b, c);
36}
Eli Friedman9595c7e2012-10-04 02:36:51 +000037
38template<typename T> class fp_contract_4 {
39 float method(float a, float b, float c) {
40 #pragma STDC FP_CONTRACT ON
41 return a * b + c;
Eli Friedman9595c7e2012-10-04 02:36:51 +000042 }
43};
44
45template class fp_contract_4<int>;
46// CHECK: _ZN13fp_contract_4IiE6methodEfff
47// CHECK: tail call float @llvm.fmuladd
Lang Hameseddb00a2012-10-04 03:07:37 +000048
49// Check file-scoped FP_CONTRACT
50#pragma STDC FP_CONTRACT ON
51float fp_contract_5(float a, float b, float c) {
52// CHECK: _Z13fp_contract_5fff
53// CHECK: tail call float @llvm.fmuladd
54 return a * b + c;
55}
56
57#pragma STDC FP_CONTRACT OFF
58float fp_contract_6(float a, float b, float c) {
59// CHECK: _Z13fp_contract_6fff
60// CHECK: %[[M:.+]] = fmul float %a, %b
61// CHECK-NEXT: fadd float %[[M]], %c
62 return a * b + c;
63}
64