comparison clang/test/CodeGen/fp-floatcontrol-stack.cpp @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents 79ff65ed7e25
children 1f2b6ac9f198
comparison
equal deleted inserted replaced
232:70dce7da266c 236:c4bab56944e8
4 // RUN: %clang_cc1 -triple x86_64-linux-gnu -ffp-contract=on -DNOHONOR=1 -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOHONOR %s 4 // RUN: %clang_cc1 -triple x86_64-linux-gnu -ffp-contract=on -DNOHONOR=1 -menable-no-infs -menable-no-nans -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOHONOR %s
5 5
6 #define FUN(n) \ 6 #define FUN(n) \
7 (float z) { return n * z + n; } 7 (float z) { return n * z + n; }
8 8
9 // CHECK-DDEFAULT: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
10 // CHECK-DEBSTRICT: Function Attrs: mustprogress noinline nounwind optnone strictfp{{$$}}
11 // CHECK-FAST: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
12 // CHECK-NOHONOR: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
9 float fun_default FUN(1) 13 float fun_default FUN(1)
10 //CHECK-LABEL: define {{.*}} @_Z11fun_defaultf{{.*}} 14 //CHECK-LABEL: define {{.*}} @_Z11fun_defaultf{{.*}}
11 #if DEFAULT 15 #if DEFAULT
12 //CHECK-DDEFAULT: call float @llvm.fmuladd{{.*}} 16 //CHECK-DDEFAULT: call float @llvm.fmuladd{{.*}}
13 #endif 17 #endif
26 #pragma float_control(push) 30 #pragma float_control(push)
27 #ifndef FAST 31 #ifndef FAST
28 // Rule: precise must be enabled 32 // Rule: precise must be enabled
29 #pragma float_control(except, on) 33 #pragma float_control(except, on)
30 #endif 34 #endif
35 // CHECK-FAST: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
36 // CHECK-DDEFAULT: Function Attrs: mustprogress noinline nounwind optnone strictfp{{$$}}
37 // CHECK-DEBSTRICT: Function Attrs: mustprogress noinline nounwind optnone strictfp{{$$}}
38 // CHECK-NOHONOR: Function Attrs: mustprogress noinline nounwind optnone strictfp{{$$}}
31 float exc_on FUN(2) 39 float exc_on FUN(2)
32 //CHECK-LABEL: define {{.*}} @_Z6exc_onf{{.*}} 40 //CHECK-LABEL: define {{.*}} @_Z6exc_onf{{.*}}
33 #if DEFAULT 41 #if DEFAULT
34 //CHECK-DDEFAULT: llvm.experimental.constrained.fmul{{.*}} 42 //CHECK-DDEFAULT: llvm.experimental.constrained.fmul{{.*}}
35 #endif 43 #endif
44 //CHECK-FAST: fmul fast float 52 //CHECK-FAST: fmul fast float
45 //CHECK-FAST: fadd fast float 53 //CHECK-FAST: fadd fast float
46 #endif 54 #endif
47 55
48 #pragma float_control(pop) 56 #pragma float_control(pop)
49 float exc_pop FUN(5) 57 // CHECK-DDEFAULT: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
58 // CHECK-DEBSTRICT: Function Attrs: mustprogress noinline nounwind optnone strictfp{{$$}}
59 // CHECK-FAST: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
60 // CHECK-NOHONOR: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
61 float exc_pop FUN(5)
50 //CHECK-LABEL: define {{.*}} @_Z7exc_popf{{.*}} 62 //CHECK-LABEL: define {{.*}} @_Z7exc_popf{{.*}}
51 #if DEFAULT 63 #if DEFAULT
52 //CHECK-DDEFAULT: call float @llvm.fmuladd{{.*}} 64 //CHECK-DDEFAULT: call float @llvm.fmuladd{{.*}}
53 #endif 65 #endif
54 #if EBSTRICT 66 #if EBSTRICT
61 //CHECK-FAST: fmul fast float 73 //CHECK-FAST: fmul fast float
62 //CHECK-FAST: fadd fast float 74 //CHECK-FAST: fadd fast float
63 #endif 75 #endif
64 76
65 #pragma float_control(except, off) 77 #pragma float_control(except, off)
66 float exc_off FUN(5) 78 float exc_off FUN(5)
67 //CHECK-LABEL: define {{.*}} @_Z7exc_offf{{.*}} 79 //CHECK-LABEL: define {{.*}} @_Z7exc_offf{{.*}}
68 #if DEFAULT 80 #if DEFAULT
69 //CHECK-DDEFAULT: call float @llvm.fmuladd{{.*}} 81 //CHECK-DDEFAULT: call float @llvm.fmuladd{{.*}}
70 #endif 82 #endif
71 #if EBSTRICT 83 #if EBSTRICT
78 //CHECK-FAST: fmul fast float 90 //CHECK-FAST: fmul fast float
79 //CHECK-FAST: fadd fast float 91 //CHECK-FAST: fadd fast float
80 #endif 92 #endif
81 93
82 #pragma float_control(precise, on, push) 94 #pragma float_control(precise, on, push)
83 float precise_on FUN(3) 95 float precise_on FUN(3)
84 //CHECK-LABEL: define {{.*}} @_Z10precise_onf{{.*}} 96 //CHECK-LABEL: define {{.*}} @_Z10precise_onf{{.*}}
85 #if DEFAULT 97 #if DEFAULT
86 //CHECK-DDEFAULT: float {{.*}}llvm.fmuladd{{.*}} 98 //CHECK-DDEFAULT: float {{.*}}llvm.fmuladd{{.*}}
87 #endif 99 #endif
88 #if EBSTRICT 100 #if EBSTRICT
95 #if FAST 107 #if FAST
96 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}} 108 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}}
97 #endif 109 #endif
98 110
99 #pragma float_control(pop) 111 #pragma float_control(pop)
100 float precise_pop FUN(3) 112 float precise_pop FUN(3)
101 //CHECK-LABEL: define {{.*}} @_Z11precise_popf{{.*}} 113 //CHECK-LABEL: define {{.*}} @_Z11precise_popf{{.*}}
102 #if DEFAULT 114 #if DEFAULT
103 //CHECK-DDEFAULT: float {{.*}}llvm.fmuladd{{.*}} 115 //CHECK-DDEFAULT: float {{.*}}llvm.fmuladd{{.*}}
104 #endif 116 #endif
105 #if EBSTRICT 117 #if EBSTRICT
111 #if FAST 123 #if FAST
112 //CHECK-FAST: fmul fast float 124 //CHECK-FAST: fmul fast float
113 //CHECK-FAST: fadd fast float 125 //CHECK-FAST: fadd fast float
114 #endif 126 #endif
115 #pragma float_control(precise, off) 127 #pragma float_control(precise, off)
116 float precise_off FUN(4) 128 float precise_off FUN(4)
117 //CHECK-LABEL: define {{.*}} @_Z11precise_offf{{.*}} 129 //CHECK-LABEL: define {{.*}} @_Z11precise_offf{{.*}}
118 #if DEFAULT 130 #if DEFAULT
119 // Note: precise_off enables fp_contract=fast and the instructions 131 // Note: precise_off enables fp_contract=fast and the instructions
120 // generated do not include the contract flag, although it was enabled 132 // generated do not include the contract flag, although it was enabled
121 // in IRBuilder. 133 // in IRBuilder.
135 //CHECK-FAST: fmul fast float 147 //CHECK-FAST: fmul fast float
136 //CHECK-FAST: fadd fast float 148 //CHECK-FAST: fadd fast float
137 #endif 149 #endif
138 150
139 #pragma float_control(precise, on) 151 #pragma float_control(precise, on)
140 float precise_on2 FUN(3) 152 float precise_on2 FUN(3)
141 //CHECK-LABEL: define {{.*}} @_Z11precise_on2f{{.*}} 153 //CHECK-LABEL: define {{.*}} @_Z11precise_on2f{{.*}}
142 #if DEFAULT 154 #if DEFAULT
143 //CHECK-DDEFAULT: llvm.fmuladd{{.*}} 155 //CHECK-DDEFAULT: llvm.fmuladd{{.*}}
144 #endif 156 #endif
145 #if EBSTRICT 157 #if EBSTRICT
152 #if FAST 164 #if FAST
153 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}} 165 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}}
154 #endif 166 #endif
155 167
156 #pragma float_control(push) 168 #pragma float_control(push)
157 float precise_push FUN(3) 169 float precise_push FUN(3)
158 //CHECK-LABEL: define {{.*}} @_Z12precise_pushf{{.*}} 170 //CHECK-LABEL: define {{.*}} @_Z12precise_pushf{{.*}}
159 #if DEFAULT 171 #if DEFAULT
160 //CHECK-DDEFAULT: llvm.fmuladd{{.*}} 172 //CHECK-DDEFAULT: llvm.fmuladd{{.*}}
161 #endif 173 #endif
162 #if EBSTRICT 174 #if EBSTRICT
168 #if FAST 180 #if FAST
169 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}} 181 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}}
170 #endif 182 #endif
171 183
172 #pragma float_control(precise, off) 184 #pragma float_control(precise, off)
173 float precise_off2 FUN(4) 185 float precise_off2 FUN(4)
174 //CHECK-LABEL: define {{.*}} @_Z12precise_off2f{{.*}} 186 //CHECK-LABEL: define {{.*}} @_Z12precise_off2f{{.*}}
175 #if DEFAULT 187 #if DEFAULT
176 //CHECK-DDEFAULT: fmul fast float 188 //CHECK-DDEFAULT: fmul fast float
177 //CHECK-DDEFAULT: fadd fast float 189 //CHECK-DDEFAULT: fadd fast float
178 #endif 190 #endif
189 //CHECK-FAST: fmul fast float 201 //CHECK-FAST: fmul fast float
190 //CHECK-FAST: fadd fast float 202 //CHECK-FAST: fadd fast float
191 #endif 203 #endif
192 204
193 #pragma float_control(pop) 205 #pragma float_control(pop)
194 float precise_pop2 FUN(3) 206 float precise_pop2 FUN(3)
195 //CHECK-LABEL: define {{.*}} @_Z12precise_pop2f{{.*}} 207 //CHECK-LABEL: define {{.*}} @_Z12precise_pop2f{{.*}}
196 #if DEFAULT 208 #if DEFAULT
197 //CHECK-DDEFAULT: llvm.fmuladd{{.*}} 209 //CHECK-DDEFAULT: llvm.fmuladd{{.*}}
198 #endif 210 #endif
199 #if EBSTRICT 211 #if EBSTRICT
208 220
209 #ifndef FAST 221 #ifndef FAST
210 // Rule: precise must be enabled 222 // Rule: precise must be enabled
211 #pragma float_control(except, on) 223 #pragma float_control(except, on)
212 #endif 224 #endif
213 float y(); 225 float y();
226 // CHECK-DDEFAULT: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
227 // CHECK-DEBSTRICT: Function Attrs: noinline nounwind optnone strictfp{{$$}}
228 // CHECK-FAST: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
229 // CHECK-NOHONOR: Function Attrs: mustprogress noinline nounwind optnone{{$$}}
214 class ON { 230 class ON {
215 // Settings for top level class initializer use program source setting. 231 // Settings for top level class initializer use program source setting.
216 float z = 2 + y() * 7; 232 float z = 2 + y() * 7;
217 //CHECK-LABEL: define {{.*}} void @_ZN2ONC2Ev{{.*}} 233 //CHECK-LABEL: define {{.*}} void @_ZN2ONC2Ev{{.*}}
218 #if DEFAULT 234 #if DEFAULT
219 //CHECK-DDEFAULT: call float {{.*}}llvm.fmuladd 235 // CHECK-DDEFAULT: llvm.experimental.constrained.fmul{{.*}}tonearest{{.*}}strict
220 #endif 236 #endif
221 #if EBSTRICT 237 #if EBSTRICT
222 //Currently, same as default [command line options not considered] 238 // CHECK-DEBSTRICT: llvm.experimental.constrained.fmul{{.*}}tonearest{{.*}}strict
223 //CHECK-DEBSTRICT: call float {{.*}}llvm.fmuladd 239 #endif
224 #endif 240 #if NOHONOR
225 #if NOHONOR 241 // CHECK-NOHONOR: llvm.experimental.constrained.fmul{{.*}}tonearest{{.*}}strict
226 //CHECK-NOHONOR: call float {{.*}}llvm.fmuladd 242 #endif
227 #endif 243 #if FAST
228 #if FAST 244 // CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}}
229 //CHECK-FAST: float {{.*}}llvm.fmuladd{{.*}}
230 #endif 245 #endif
231 }; 246 };
232 ON on; 247 ON on;
233 #pragma float_control(except, off) 248 #pragma float_control(except, off)
249 // CHECK-DDEFAULT: Function Attrs: noinline nounwind optnone{{$$}}
250 // CHECK-DEBSTRICT: Function Attrs: noinline nounwind optnone{{$$}}
251 // CHECK-FAST: Function Attrs: noinline nounwind optnone{{$$}}
252 // CHECK-NOHONOR: Function Attrs: noinline nounwind optnone{{$$}}
234 class OFF { 253 class OFF {
235 float w = 2 + y() * 7; 254 float w = 2 + y() * 7;
236 //CHECK-LABEL: define {{.*}} void @_ZN3OFFC2Ev{{.*}} 255 // CHECK-LABEL: define {{.*}} void @_ZN3OFFC2Ev{{.*}}
237 //CHECK: call float {{.*}}llvm.fmuladd 256 // CHECK: call float {{.*}}llvm.fmuladd
238 }; 257 };
239 OFF off; 258 OFF off;
240 259
241 #pragma clang fp reassociate(on) 260 #pragma clang fp reassociate(on)
242 struct MyComplex { 261 struct MyComplex {
246 xx = x; 265 xx = x;
247 yy = y; 266 yy = y;
248 } 267 }
249 MyComplex() {} 268 MyComplex() {}
250 const MyComplex operator+(const MyComplex other) const { 269 const MyComplex operator+(const MyComplex other) const {
251 //CHECK-LABEL: define {{.*}} @_ZNK9MyComplexplES_ 270 // CHECK-LABEL: define {{.*}} @_ZNK9MyComplexplES_
252 //CHECK: fadd reassoc float 271 // CHECK: fadd reassoc float
253 //CHECK: fadd reassoc float 272 // CHECK: fadd reassoc float
254 return MyComplex(xx + other.xx, yy + other.yy); 273 return MyComplex(xx + other.xx, yy + other.yy);
255 } 274 }
256 }; 275 };
257 MyComplex useAdd() { 276 MyComplex useAdd() {
258 MyComplex a (1, 3); 277 MyComplex a (1, 3);
259 MyComplex b (2, 4); 278 MyComplex b (2, 4);
260 return a + b; 279 return a + b;
261 } 280 }
281
282 // CHECK-DDEFAULT: Function Attrs: noinline nounwind{{$$}}
283 // CHECK-DEBSTRICT: Function Attrs: noinline nounwind strictfp{{$$}}
284 // CHECK-FAST: Function Attrs: noinline nounwind{{$$}}
285 // CHECK-NOHONOR: Function Attrs: noinline nounwind{{$$}}
286 // CHECK-LABEL: define{{.*}} @_GLOBAL__sub_I_fp_floatcontrol_stack