xref: /llvm-project/llvm/test/Transforms/SCCP/strictfp-phis-fcmps.ll (revision 819abe412dd554303cb932d6ec2200b9b9ebdd78)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=sccp -S | FileCheck %s
3
4define i1 @float.1.defaultenv(i1 %cmp) #0 {
5; CHECK-LABEL: @float.1.defaultenv(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
8; CHECK:       if.true:
9; CHECK-NEXT:    br label [[END]]
10; CHECK:       end:
11; CHECK-NEXT:    ret i1 true
12;
13
14entry:
15  br i1 %cmp, label %if.true, label %end
16
17if.true:
18  br label %end
19
20end:
21  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true]
22  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.ignore") #0
23
24  ret i1 %c
25}
26
27define i1 @float.1.maytrap(i1 %cmp) #0 {
28; CHECK-LABEL: @float.1.maytrap(
29; CHECK-NEXT:  entry:
30; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
31; CHECK:       if.true:
32; CHECK-NEXT:    br label [[END]]
33; CHECK:       end:
34; CHECK-NEXT:    ret i1 true
35;
36
37entry:
38  br i1 %cmp, label %if.true, label %end
39
40if.true:
41  br label %end
42
43end:
44  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true]
45  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.maytrap") #0
46
47  ret i1 %c
48}
49
50define i1 @float.1.strict(i1 %cmp) #0 {
51; CHECK-LABEL: @float.1.strict(
52; CHECK-NEXT:  entry:
53; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
54; CHECK:       if.true:
55; CHECK-NEXT:    br label [[END]]
56; CHECK:       end:
57; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0:[0-9]+]]
58; CHECK-NEXT:    ret i1 true
59;
60
61entry:
62  br i1 %cmp, label %if.true, label %end
63
64if.true:
65  br label %end
66
67end:
68  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true]
69  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.strict") #0
70
71  ret i1 %c
72}
73
74define i1 @float.2.defaultenv(i1 %cmp) #0 {
75; CHECK-LABEL: @float.2.defaultenv(
76; CHECK-NEXT:  entry:
77; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
78; CHECK:       if.true:
79; CHECK-NEXT:    br label [[END]]
80; CHECK:       end:
81; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, [[ENTRY:%.*]] ], [ 2.000000e+00, [[IF_TRUE]] ]
82; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float [[P]], float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.ignore") #[[ATTR0]]
83; CHECK-NEXT:    ret i1 [[C]]
84;
85
86entry:
87  br i1 %cmp, label %if.true, label %end
88
89if.true:
90  br label %end
91
92end:
93  %p = phi float [ 1.0, %entry ], [ 2.0, %if.true]
94  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.ignore") #0
95  ret i1 %c
96}
97
98define i1 @float.2.maytrap(i1 %cmp) #0 {
99; CHECK-LABEL: @float.2.maytrap(
100; CHECK-NEXT:  entry:
101; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
102; CHECK:       if.true:
103; CHECK-NEXT:    br label [[END]]
104; CHECK:       end:
105; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, [[ENTRY:%.*]] ], [ 2.000000e+00, [[IF_TRUE]] ]
106; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float [[P]], float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.maytrap") #[[ATTR0]]
107; CHECK-NEXT:    ret i1 [[C]]
108;
109
110entry:
111  br i1 %cmp, label %if.true, label %end
112
113if.true:
114  br label %end
115
116end:
117  %p = phi float [ 1.0, %entry ], [ 2.0, %if.true]
118  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.maytrap") #0
119  ret i1 %c
120}
121
122define i1 @float.2.strict(i1 %cmp) #0 {
123; CHECK-LABEL: @float.2.strict(
124; CHECK-NEXT:  entry:
125; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
126; CHECK:       if.true:
127; CHECK-NEXT:    br label [[END]]
128; CHECK:       end:
129; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, [[ENTRY:%.*]] ], [ 2.000000e+00, [[IF_TRUE]] ]
130; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float [[P]], float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0]]
131; CHECK-NEXT:    ret i1 [[C]]
132;
133
134entry:
135  br i1 %cmp, label %if.true, label %end
136
137if.true:
138  br label %end
139
140end:
141  %p = phi float [ 1.0, %entry ], [ 2.0, %if.true]
142  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.strict") #0
143  ret i1 %c
144}
145
146define i1 @float.3.defaultenv(float %f, i1 %cmp) #0 {
147; CHECK-LABEL: @float.3.defaultenv(
148; CHECK-NEXT:  entry:
149; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
150; CHECK:       if.true:
151; CHECK-NEXT:    br label [[END]]
152; CHECK:       end:
153; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, [[ENTRY:%.*]] ], [ [[F:%.*]], [[IF_TRUE]] ]
154; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float [[P]], float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.ignore") #[[ATTR0]]
155; CHECK-NEXT:    ret i1 [[C]]
156;
157
158entry:
159  br i1 %cmp, label %if.true, label %end
160
161if.true:
162  br label %end
163
164end:
165  %p = phi float [ 1.0, %entry ], [ %f, %if.true]
166  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.ignore") #0
167  ret i1 %c
168}
169
170define i1 @float.3.maytrap(float %f, i1 %cmp) #0 {
171; CHECK-LABEL: @float.3.maytrap(
172; CHECK-NEXT:  entry:
173; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
174; CHECK:       if.true:
175; CHECK-NEXT:    br label [[END]]
176; CHECK:       end:
177; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, [[ENTRY:%.*]] ], [ [[F:%.*]], [[IF_TRUE]] ]
178; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float [[P]], float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.maytrap") #[[ATTR0]]
179; CHECK-NEXT:    ret i1 [[C]]
180;
181
182entry:
183  br i1 %cmp, label %if.true, label %end
184
185if.true:
186  br label %end
187
188end:
189  %p = phi float [ 1.0, %entry ], [ %f, %if.true]
190  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.maytrap") #0
191  ret i1 %c
192}
193
194define i1 @float.3.strict(float %f, i1 %cmp) #0 {
195; CHECK-LABEL: @float.3.strict(
196; CHECK-NEXT:  entry:
197; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
198; CHECK:       if.true:
199; CHECK-NEXT:    br label [[END]]
200; CHECK:       end:
201; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, [[ENTRY:%.*]] ], [ [[F:%.*]], [[IF_TRUE]] ]
202; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float [[P]], float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0]]
203; CHECK-NEXT:    ret i1 [[C]]
204;
205
206entry:
207  br i1 %cmp, label %if.true, label %end
208
209if.true:
210  br label %end
211
212end:
213  %p = phi float [ 1.0, %entry ], [ %f, %if.true]
214  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"ueq", metadata !"fpexcept.strict") #0
215  ret i1 %c
216}
217
218define i1 @float.4_unreachable.defaultenv(float %f, i1 %cmp) #0 {
219; CHECK-LABEL: @float.4_unreachable.defaultenv(
220; CHECK-NEXT:  entry:
221; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
222; CHECK:       if.true:
223; CHECK-NEXT:    br label [[END]]
224; CHECK:       end:
225; CHECK-NEXT:    ret i1 false
226;
227
228entry:
229  br i1 %cmp, label %if.true, label %end
230
231if.true:
232  br label %end
233
234dead:
235  br label %end
236
237end:
238  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true], [ %f, %dead ]
239  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"une", metadata !"fpexcept.ignore") #0
240  ret i1 %c
241}
242
243define i1 @float.4_unreachable.maytrap(float %f, i1 %cmp) #0 {
244; CHECK-LABEL: @float.4_unreachable.maytrap(
245; CHECK-NEXT:  entry:
246; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
247; CHECK:       if.true:
248; CHECK-NEXT:    br label [[END]]
249; CHECK:       end:
250; CHECK-NEXT:    ret i1 false
251;
252
253entry:
254  br i1 %cmp, label %if.true, label %end
255
256if.true:
257  br label %end
258
259dead:
260  br label %end
261
262end:
263  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true], [ %f, %dead ]
264  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"une", metadata !"fpexcept.maytrap") #0
265  ret i1 %c
266}
267
268; FIXME: It's a shame we can't eliminate this fcmps here:
269define i1 @float.4_unreachable.strict(float %f, i1 %cmp) #0 {
270; CHECK-LABEL: @float.4_unreachable.strict(
271; CHECK-NEXT:  entry:
272; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
273; CHECK:       if.true:
274; CHECK-NEXT:    br label [[END]]
275; CHECK:       end:
276; CHECK-NEXT:    [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.strict") #[[ATTR0]]
277; CHECK-NEXT:    ret i1 false
278;
279
280entry:
281  br i1 %cmp, label %if.true, label %end
282
283if.true:
284  br label %end
285
286dead:
287  br label %end
288
289end:
290  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true], [ %f, %dead ]
291  %c = call i1 @llvm.experimental.constrained.fcmps.f32(float %p, float 1.0, metadata !"une", metadata !"fpexcept.strict") #0
292  ret i1 %c
293}
294
295attributes #0 = { strictfp }
296
297declare i1 @llvm.experimental.constrained.fcmps.f32(float, float, metadata, metadata)
298
299