Mercurial > hg > CbC > CbC_llvm
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 |