1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fexperimental-strict-floating-point \
2bbf0d193SZahira Ammarguellat // RUN: -triple x86_64-linux-gnu -emit-llvm -o - %s \
3bbf0d193SZahira Ammarguellat // RUN: | FileCheck %s -check-prefixes=CHECK
4bbf0d193SZahira Ammarguellat
5*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -triple i386--linux -emit-llvm -o - %s \
6bbf0d193SZahira Ammarguellat // RUN: | FileCheck %s -check-prefixes=CHECK-EXT
7bbf0d193SZahira Ammarguellat
8*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fexperimental-strict-floating-point \
9bbf0d193SZahira Ammarguellat // RUN: -mreassociate -freciprocal-math -ffp-contract=fast \
10bbf0d193SZahira Ammarguellat // RUN: -ffast-math -triple x86_64-linux-gnu \
11bbf0d193SZahira Ammarguellat // RUN: -emit-llvm -o - %s \
12bbf0d193SZahira Ammarguellat // RUN: | FileCheck %s -check-prefixes=CHECK-FAST
13bbf0d193SZahira Ammarguellat
14*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -triple i386--linux -mreassociate -freciprocal-math \
15bbf0d193SZahira Ammarguellat // RUN: -ffp-contract=fast -ffast-math -emit-llvm -o - %s \
16bbf0d193SZahira Ammarguellat // RUN: | FileCheck %s -check-prefixes=CHECK-FAST
17bbf0d193SZahira Ammarguellat
18bbf0d193SZahira Ammarguellat float a = 1.0f, b = 2.0f, c = 3.0f;
19bbf0d193SZahira Ammarguellat #pragma float_control(precise, off)
20bbf0d193SZahira Ammarguellat float res2 = a + b + c;
21bbf0d193SZahira Ammarguellat int val3 = __FLT_EVAL_METHOD__;
22bbf0d193SZahira Ammarguellat #pragma float_control(precise, on)
23bbf0d193SZahira Ammarguellat float res3 = a + b + c;
24bbf0d193SZahira Ammarguellat int val4 = __FLT_EVAL_METHOD__;
25bbf0d193SZahira Ammarguellat
26bbf0d193SZahira Ammarguellat // CHECK: @val3 = global i32 -1
27bbf0d193SZahira Ammarguellat // CHECK: @val4 = global i32 0
28bbf0d193SZahira Ammarguellat
29bbf0d193SZahira Ammarguellat // CHECK-EXT: @val3 = global i32 -1
30bbf0d193SZahira Ammarguellat // CHECK-EXT: @val4 = global i32 2
31bbf0d193SZahira Ammarguellat
32bbf0d193SZahira Ammarguellat // CHECK-FAST: @val3 = global i32 -1
33bbf0d193SZahira Ammarguellat // CHECK-FAST: @val4 = global i32 -1
34bbf0d193SZahira Ammarguellat
35bbf0d193SZahira Ammarguellat float res;
add(float a,float b,float c)36bbf0d193SZahira Ammarguellat int add(float a, float b, float c) {
37bbf0d193SZahira Ammarguellat // CHECK: fadd float
38bbf0d193SZahira Ammarguellat // CHECK: load float, float*
39bbf0d193SZahira Ammarguellat // CHECK: fadd float
40bbf0d193SZahira Ammarguellat // CHECK: store float
41bbf0d193SZahira Ammarguellat // CHECK: ret i32 0
42bbf0d193SZahira Ammarguellat res = a + b + c;
43bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
44bbf0d193SZahira Ammarguellat }
45bbf0d193SZahira Ammarguellat
add_precise(float a,float b,float c)46bbf0d193SZahira Ammarguellat int add_precise(float a, float b, float c) {
47bbf0d193SZahira Ammarguellat #pragma float_control(precise, on)
48bbf0d193SZahira Ammarguellat // CHECK: fadd float
49bbf0d193SZahira Ammarguellat // CHECK: load float, float*
50bbf0d193SZahira Ammarguellat // CHECK: fadd float
51bbf0d193SZahira Ammarguellat // CHECK: store float
52bbf0d193SZahira Ammarguellat // CHECK: ret i32 0
53bbf0d193SZahira Ammarguellat res = a + b + c;
54bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
55bbf0d193SZahira Ammarguellat }
56bbf0d193SZahira Ammarguellat
57bbf0d193SZahira Ammarguellat #pragma float_control(push)
58bbf0d193SZahira Ammarguellat #pragma float_control(precise, on)
add_precise_1(float a,float b,float c)59bbf0d193SZahira Ammarguellat int add_precise_1(float a, float b, float c) {
60bbf0d193SZahira Ammarguellat // CHECK: fadd float
61bbf0d193SZahira Ammarguellat // CHECK: load float, float*
62bbf0d193SZahira Ammarguellat // CHECK: fadd float
63bbf0d193SZahira Ammarguellat // CHECK: store float
64bbf0d193SZahira Ammarguellat // CHECK: ret i32 0
65bbf0d193SZahira Ammarguellat res = a + b + c;
66bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
67bbf0d193SZahira Ammarguellat }
68bbf0d193SZahira Ammarguellat #pragma float_control(pop)
69bbf0d193SZahira Ammarguellat
add_not_precise(float a,float b,float c)70bbf0d193SZahira Ammarguellat int add_not_precise(float a, float b, float c) {
71bbf0d193SZahira Ammarguellat // Fast-math is enabled with this pragma.
72bbf0d193SZahira Ammarguellat #pragma float_control(precise, off)
73bbf0d193SZahira Ammarguellat // CHECK: fadd fast float
74bbf0d193SZahira Ammarguellat // CHECK: load float, float*
75bbf0d193SZahira Ammarguellat // CHECK: fadd fast float
76bbf0d193SZahira Ammarguellat // CHECK: float {{.*}}, float*
77bbf0d193SZahira Ammarguellat // CHECK: ret i32 -1
78bbf0d193SZahira Ammarguellat res = a + b + c;
79bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
80bbf0d193SZahira Ammarguellat }
81bbf0d193SZahira Ammarguellat
82bbf0d193SZahira Ammarguellat #pragma float_control(push)
83bbf0d193SZahira Ammarguellat // Fast-math is enabled with this pragma.
84bbf0d193SZahira Ammarguellat #pragma float_control(precise, off)
add_not_precise_1(float a,float b,float c)85bbf0d193SZahira Ammarguellat int add_not_precise_1(float a, float b, float c) {
86bbf0d193SZahira Ammarguellat // CHECK: fadd fast float
87bbf0d193SZahira Ammarguellat // CHECK: load float, float*
88bbf0d193SZahira Ammarguellat // CHECK: fadd fast float
89bbf0d193SZahira Ammarguellat // CHECK: float {{.*}}, float*
90bbf0d193SZahira Ammarguellat // CHECK: ret i32 -1
91bbf0d193SZahira Ammarguellat res = a + b + c;
92bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
93bbf0d193SZahira Ammarguellat }
94bbf0d193SZahira Ammarguellat #pragma float_control(pop)
95bbf0d193SZahira Ammarguellat
getFPEvalMethod()96bbf0d193SZahira Ammarguellat int getFPEvalMethod() {
97bbf0d193SZahira Ammarguellat // CHECK: ret i32 0
98bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
99bbf0d193SZahira Ammarguellat }
100bbf0d193SZahira Ammarguellat
101bbf0d193SZahira Ammarguellat float res1;
whatever(float a,float b,float c)102bbf0d193SZahira Ammarguellat int whatever(float a, float b, float c) {
103bbf0d193SZahira Ammarguellat #pragma float_control(precise, off)
104bbf0d193SZahira Ammarguellat // CHECK: load float, float*
105bbf0d193SZahira Ammarguellat // CHECK: fadd fast float
106bbf0d193SZahira Ammarguellat // CHECK: store float {{.*}}, float*
107bbf0d193SZahira Ammarguellat // CHECK: store i32 -1
108bbf0d193SZahira Ammarguellat // CHECK: store i32 0
109bbf0d193SZahira Ammarguellat // CHECK: ret i32 -1
110bbf0d193SZahira Ammarguellat res1 = a + b + c;
111bbf0d193SZahira Ammarguellat int val1 = __FLT_EVAL_METHOD__;
112bbf0d193SZahira Ammarguellat {
113bbf0d193SZahira Ammarguellat #pragma float_control(precise, on)
114bbf0d193SZahira Ammarguellat int val2 = __FLT_EVAL_METHOD__;
115bbf0d193SZahira Ammarguellat }
116bbf0d193SZahira Ammarguellat return __FLT_EVAL_METHOD__;
117bbf0d193SZahira Ammarguellat }
118