xref: /llvm-project/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll (revision c2c48f0c9693d2eda30a96660d4861bbd621d6ea)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4define float @fadd_undef_op0(float %x) {
5; CHECK-LABEL: @fadd_undef_op0(
6; CHECK-NEXT:    ret float 0x7FF8000000000000
7;
8  %r = fadd float undef, %x
9  ret float %r
10}
11
12define float @fadd_poison_op0(float %x) {
13; CHECK-LABEL: @fadd_poison_op0(
14; CHECK-NEXT:    ret float poison
15;
16  %r = fadd float poison, %x
17  ret float %r
18}
19
20define float @fadd_undef_op1(float %x) {
21; CHECK-LABEL: @fadd_undef_op1(
22; CHECK-NEXT:    ret float 0x7FF8000000000000
23;
24  %r = fadd float %x, undef
25  ret float %r
26}
27
28define float @fadd_poison_op1(float %x) {
29; CHECK-LABEL: @fadd_poison_op1(
30; CHECK-NEXT:    ret float poison
31;
32  %r = fadd float %x, poison
33  ret float %r
34}
35
36define float @fsub_undef_op0(float %x) {
37; CHECK-LABEL: @fsub_undef_op0(
38; CHECK-NEXT:    ret float 0x7FF8000000000000
39;
40  %r = fsub float undef, %x
41  ret float %r
42}
43
44define float @fsub_poison_op0(float %x) {
45; CHECK-LABEL: @fsub_poison_op0(
46; CHECK-NEXT:    ret float poison
47;
48  %r = fsub float poison, %x
49  ret float %r
50}
51
52define float @fsub_undef_op1(float %x) {
53; CHECK-LABEL: @fsub_undef_op1(
54; CHECK-NEXT:    ret float 0x7FF8000000000000
55;
56  %r = fsub float %x, undef
57  ret float %r
58}
59
60define float @fsub_poison_op1(float %x) {
61; CHECK-LABEL: @fsub_poison_op1(
62; CHECK-NEXT:    ret float poison
63;
64  %r = fsub float %x, poison
65  ret float %r
66}
67
68define float @fmul_undef_op0(float %x) {
69; CHECK-LABEL: @fmul_undef_op0(
70; CHECK-NEXT:    ret float 0x7FF8000000000000
71;
72  %r = fmul float undef, %x
73  ret float %r
74}
75
76define float @fmul_poison_op0(float %x) {
77; CHECK-LABEL: @fmul_poison_op0(
78; CHECK-NEXT:    ret float poison
79;
80  %r = fmul float poison, %x
81  ret float %r
82}
83
84define float @fmul_undef_op1(float %x) {
85; CHECK-LABEL: @fmul_undef_op1(
86; CHECK-NEXT:    ret float 0x7FF8000000000000
87;
88  %r = fmul float %x, undef
89  ret float %r
90}
91
92define float @fmul_poison_op1(float %x) {
93; CHECK-LABEL: @fmul_poison_op1(
94; CHECK-NEXT:    ret float poison
95;
96  %r = fmul float %x, poison
97  ret float %r
98}
99
100define float @fdiv_undef_op0(float %x) {
101; CHECK-LABEL: @fdiv_undef_op0(
102; CHECK-NEXT:    ret float 0x7FF8000000000000
103;
104  %r = fdiv float undef, %x
105  ret float %r
106}
107
108define float @fdiv_poison_op0(float %x) {
109; CHECK-LABEL: @fdiv_poison_op0(
110; CHECK-NEXT:    ret float poison
111;
112  %r = fdiv float poison, %x
113  ret float %r
114}
115
116define float @fdiv_undef_op1(float %x) {
117; CHECK-LABEL: @fdiv_undef_op1(
118; CHECK-NEXT:    ret float 0x7FF8000000000000
119;
120  %r = fdiv float %x, undef
121  ret float %r
122}
123
124define float @fdiv_poison_op1(float %x) {
125; CHECK-LABEL: @fdiv_poison_op1(
126; CHECK-NEXT:    ret float poison
127;
128  %r = fdiv float %x, poison
129  ret float %r
130}
131
132define float @frem_undef_op0(float %x) {
133; CHECK-LABEL: @frem_undef_op0(
134; CHECK-NEXT:    ret float 0x7FF8000000000000
135;
136  %r = frem float undef, %x
137  ret float %r
138}
139
140define float @frem_poison_op0(float %x) {
141; CHECK-LABEL: @frem_poison_op0(
142; CHECK-NEXT:    ret float poison
143;
144  %r = frem float poison, %x
145  ret float %r
146}
147
148define float @frem_undef_op1(float %x) {
149; CHECK-LABEL: @frem_undef_op1(
150; CHECK-NEXT:    ret float 0x7FF8000000000000
151;
152  %r = frem float %x, undef
153  ret float %r
154}
155
156define float @frem_poison_op1(float %x) {
157; CHECK-LABEL: @frem_poison_op1(
158; CHECK-NEXT:    ret float poison
159;
160  %r = frem float %x, poison
161  ret float %r
162}
163
164; Repeat all tests with fast-math-flags. Alternate 'nnan' and 'fast' for more coverage.
165
166define float @fadd_undef_op0_nnan(float %x) {
167; CHECK-LABEL: @fadd_undef_op0_nnan(
168; CHECK-NEXT:    ret float poison
169;
170  %r = fadd nnan float undef, %x
171  ret float %r
172}
173
174define float @fadd_undef_op1_fast(float %x) {
175; CHECK-LABEL: @fadd_undef_op1_fast(
176; CHECK-NEXT:    ret float poison
177;
178  %r = fadd fast float %x, undef
179  ret float %r
180}
181
182define float @fsub_undef_op0_fast(float %x) {
183; CHECK-LABEL: @fsub_undef_op0_fast(
184; CHECK-NEXT:    ret float poison
185;
186  %r = fsub fast float undef, %x
187  ret float %r
188}
189
190define float @fsub_undef_op1_nnan(float %x) {
191; CHECK-LABEL: @fsub_undef_op1_nnan(
192; CHECK-NEXT:    ret float poison
193;
194  %r = fsub nnan float %x, undef
195  ret float %r
196}
197
198define float @fmul_undef_op0_nnan(float %x) {
199; CHECK-LABEL: @fmul_undef_op0_nnan(
200; CHECK-NEXT:    ret float poison
201;
202  %r = fmul nnan float undef, %x
203  ret float %r
204}
205
206define float @fmul_undef_op1_fast(float %x) {
207; CHECK-LABEL: @fmul_undef_op1_fast(
208; CHECK-NEXT:    ret float poison
209;
210  %r = fmul fast float %x, undef
211  ret float %r
212}
213
214define float @fdiv_undef_op0_fast(float %x) {
215; CHECK-LABEL: @fdiv_undef_op0_fast(
216; CHECK-NEXT:    ret float poison
217;
218  %r = fdiv fast float undef, %x
219  ret float %r
220}
221
222define float @fdiv_undef_op1_nnan(float %x) {
223; CHECK-LABEL: @fdiv_undef_op1_nnan(
224; CHECK-NEXT:    ret float poison
225;
226  %r = fdiv nnan float %x, undef
227  ret float %r
228}
229
230define float @frem_undef_op0_nnan(float %x) {
231; CHECK-LABEL: @frem_undef_op0_nnan(
232; CHECK-NEXT:    ret float poison
233;
234  %r = frem nnan float undef, %x
235  ret float %r
236}
237
238define float @frem_undef_op1_fast(float %x) {
239; CHECK-LABEL: @frem_undef_op1_fast(
240; CHECK-NEXT:    ret float poison
241;
242  %r = frem fast float %x, undef
243  ret float %r
244}
245
246define double @fdiv_ninf_nan_op0(double %x) {
247; CHECK-LABEL: @fdiv_ninf_nan_op0(
248; CHECK-NEXT:    ret double 0xFFF8000000000000
249;
250  %r = fdiv ninf double 0xfff8000000000000, %x
251  ret double %r
252}
253
254define double @fadd_ninf_nan_op1(double %x) {
255; CHECK-LABEL: @fadd_ninf_nan_op1(
256; CHECK-NEXT:    ret double 0x7FF8000000000000
257;
258  %r = fadd ninf double %x, 0x7ff8000000000000
259  ret double %r
260}
261
262define double @fdiv_ninf_inf_op0(double %x) {
263; CHECK-LABEL: @fdiv_ninf_inf_op0(
264; CHECK-NEXT:    ret double poison
265;
266  %r = fdiv ninf double 0x7ff0000000000000, %x
267  ret double %r
268}
269
270define double @fadd_ninf_inf_op1(double %x) {
271; CHECK-LABEL: @fadd_ninf_inf_op1(
272; CHECK-NEXT:    ret double poison
273;
274  %r = fadd ninf double %x, 0xfff0000000000000
275  ret double %r
276}
277
278define double @fsub_nnan_inf_op0(double %x) {
279; CHECK-LABEL: @fsub_nnan_inf_op0(
280; CHECK-NEXT:    ret double 0x7FF0000000000000
281;
282  %r = fsub nnan double 0x7ff0000000000000, %x
283  ret double %r
284}
285
286; This can't simplify - the result is infinity, but the sign is unknown.
287
288define double @fmul_nnan_inf_op1(double %x) {
289; CHECK-LABEL: @fmul_nnan_inf_op1(
290; CHECK-NEXT:    [[R:%.*]] = fmul nnan double [[X:%.*]], 0xFFF0000000000000
291; CHECK-NEXT:    ret double [[R]]
292;
293  %r = fmul nnan double %x, 0xfff0000000000000
294  ret double %r
295}
296