xref: /llvm-project/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll (revision a67bd94fdafce716b42e0cb5409ee451b20f1749)
1542a3cb9SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2542a3cb9SYingwei Zheng; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3542a3cb9SYingwei Zheng
4542a3cb9SYingwei Zhengdefine i1 @test1(float %x) {
5542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test1(
6542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
7542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
8542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
9542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
10542a3cb9SYingwei Zheng; CHECK:       if.then:
11542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
12542a3cb9SYingwei Zheng; CHECK:       if.else:
13542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780)
14542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
15542a3cb9SYingwei Zheng;
16542a3cb9SYingwei Zhengentry:
17542a3cb9SYingwei Zheng  %cond = fcmp ueq float %x, 0.000000e+00
18542a3cb9SYingwei Zheng  br i1 %cond, label %if.then, label %if.else
19542a3cb9SYingwei Zheng
20542a3cb9SYingwei Zhengif.then:
21542a3cb9SYingwei Zheng  ret i1 false
22542a3cb9SYingwei Zheng
23542a3cb9SYingwei Zhengif.else:
24542a3cb9SYingwei Zheng  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
25542a3cb9SYingwei Zheng  ret i1 %ret
26542a3cb9SYingwei Zheng}
27542a3cb9SYingwei Zheng
28542a3cb9SYingwei Zhengdefine i1 @test2(double %x) {
29542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test2(
30542a3cb9SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
31542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
32542a3cb9SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000
33542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
34542a3cb9SYingwei Zheng; CHECK:       if.then:
35542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
36542a3cb9SYingwei Zheng; CHECK:       if.end:
37542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
38542a3cb9SYingwei Zheng;
39542a3cb9SYingwei Zhengentry:
40542a3cb9SYingwei Zheng  %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000
41542a3cb9SYingwei Zheng  br i1 %cmp, label %if.then, label %if.end
42542a3cb9SYingwei Zhengif.then:
43542a3cb9SYingwei Zheng  ret i1 false
44542a3cb9SYingwei Zhengif.end:
45542a3cb9SYingwei Zheng  %cmp.i = fcmp oeq double %x, 0.000000e+00
46542a3cb9SYingwei Zheng  ret i1 %cmp.i
47542a3cb9SYingwei Zheng}
48542a3cb9SYingwei Zheng
4916ec5349SYingwei Zhengdefine i1 @test2_or(double %x, i1 %cond) {
5016ec5349SYingwei Zheng; CHECK-LABEL: define i1 @test2_or(
5116ec5349SYingwei Zheng; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {
5216ec5349SYingwei Zheng; CHECK-NEXT:  entry:
5316ec5349SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000
5416ec5349SYingwei Zheng; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP]], [[COND]]
5516ec5349SYingwei Zheng; CHECK-NEXT:    br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
5616ec5349SYingwei Zheng; CHECK:       if.then:
5716ec5349SYingwei Zheng; CHECK-NEXT:    ret i1 false
5816ec5349SYingwei Zheng; CHECK:       if.end:
5916ec5349SYingwei Zheng; CHECK-NEXT:    ret i1 false
6016ec5349SYingwei Zheng;
6116ec5349SYingwei Zhengentry:
6216ec5349SYingwei Zheng  %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000
6316ec5349SYingwei Zheng  %or = or i1 %cmp, %cond
6416ec5349SYingwei Zheng  br i1 %or, label %if.then, label %if.end
6516ec5349SYingwei Zheng
6616ec5349SYingwei Zhengif.then:
6716ec5349SYingwei Zheng  ret i1 false
6816ec5349SYingwei Zheng
6916ec5349SYingwei Zhengif.end:
7016ec5349SYingwei Zheng  %cmp.i = fcmp oeq double %x, 0.000000e+00
7116ec5349SYingwei Zheng  ret i1 %cmp.i
7216ec5349SYingwei Zheng}
7316ec5349SYingwei Zheng
74542a3cb9SYingwei Zhengdefine i1 @test3(float %x) {
75542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test3(
76542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
77542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
78542a3cb9SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X]], 3.000000e+00
79542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
80542a3cb9SYingwei Zheng; CHECK:       if.then:
81542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = fcmp oeq float [[X]], 0x7FF0000000000000
82542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
83542a3cb9SYingwei Zheng; CHECK:       if.else:
84542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
85542a3cb9SYingwei Zheng;
86542a3cb9SYingwei Zhengentry:
87542a3cb9SYingwei Zheng  %cmp = fcmp ogt float %x, 3.000000e+00
88542a3cb9SYingwei Zheng  br i1 %cmp, label %if.then, label %if.else
89542a3cb9SYingwei Zhengif.then:
90542a3cb9SYingwei Zheng  %abs = call float @llvm.fabs.f32(float %x)
91542a3cb9SYingwei Zheng  %ret = fcmp oeq float %abs, 0x7FF0000000000000
92542a3cb9SYingwei Zheng  ret i1 %ret
93542a3cb9SYingwei Zhengif.else:
94542a3cb9SYingwei Zheng  ret i1 false
95542a3cb9SYingwei Zheng}
96542a3cb9SYingwei Zheng
97542a3cb9SYingwei Zhengdefine float @test4(float %x) {
98542a3cb9SYingwei Zheng; CHECK-LABEL: define float @test4(
99542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
100542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
101542a3cb9SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt float [[X]], 0x3EB0C6F7A0000000
102542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
103542a3cb9SYingwei Zheng; CHECK:       if.then:
104542a3cb9SYingwei Zheng; CHECK-NEXT:    ret float 1.000000e+00
105542a3cb9SYingwei Zheng; CHECK:       if.end:
106542a3cb9SYingwei Zheng; CHECK-NEXT:    [[DIV:%.*]] = fdiv float 1.000000e+00, [[X]]
107542a3cb9SYingwei Zheng; CHECK-NEXT:    ret float [[DIV]]
108542a3cb9SYingwei Zheng;
109542a3cb9SYingwei Zhengentry:
110542a3cb9SYingwei Zheng  %cmp = fcmp olt float %x, 0x3EB0C6F7A0000000
111542a3cb9SYingwei Zheng  br i1 %cmp, label %if.then, label %if.end
112542a3cb9SYingwei Zheng
113542a3cb9SYingwei Zhengif.then:
114542a3cb9SYingwei Zheng  ret float 1.0
115542a3cb9SYingwei Zheng
116542a3cb9SYingwei Zhengif.end:
117542a3cb9SYingwei Zheng  %cmp.i = fcmp oeq float %x, 0.000000e+00
118542a3cb9SYingwei Zheng  %div = fdiv float 1.000000e+00, %x
119542a3cb9SYingwei Zheng  %ret = select i1 %cmp.i, float 1.000000e+00, float %div
120542a3cb9SYingwei Zheng  ret float %ret
121542a3cb9SYingwei Zheng}
122542a3cb9SYingwei Zheng
123542a3cb9SYingwei Zhengdefine i1 @test5(double %x, i1 %cond) {
124542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test5(
125542a3cb9SYingwei Zheng; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {
126542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
127542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
128542a3cb9SYingwei Zheng; CHECK:       if:
129542a3cb9SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno double [[X]], 0.000000e+00
130542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
131542a3cb9SYingwei Zheng; CHECK:       if.then:
132542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
133542a3cb9SYingwei Zheng; CHECK:       if.end:
134542a3cb9SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
135542a3cb9SYingwei Zheng; CHECK:       exit:
136542a3cb9SYingwei Zheng; CHECK-NEXT:    [[Y:%.*]] = phi double [ -1.000000e+00, [[ENTRY:%.*]] ], [ [[X]], [[IF_END]] ]
137542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[Y]], i32 408)
138542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
139542a3cb9SYingwei Zheng;
140542a3cb9SYingwei Zhengentry:
141542a3cb9SYingwei Zheng  br i1 %cond, label %if, label %exit
142542a3cb9SYingwei Zhengif:
143542a3cb9SYingwei Zheng  %cmp = fcmp uno double %x, 0.000000e+00
144542a3cb9SYingwei Zheng  br i1 %cmp, label %if.then, label %if.end
145542a3cb9SYingwei Zhengif.then:
146542a3cb9SYingwei Zheng  ret i1 false
147542a3cb9SYingwei Zhengif.end:
148542a3cb9SYingwei Zheng  br label %exit
149542a3cb9SYingwei Zhengexit:
150542a3cb9SYingwei Zheng  %y = phi double [ -1.000000e+00, %entry ], [ %x, %if.end ]
151542a3cb9SYingwei Zheng  %ret = tail call i1 @llvm.is.fpclass.f64(double %y, i32 411)
152542a3cb9SYingwei Zheng  ret i1 %ret
153542a3cb9SYingwei Zheng}
154542a3cb9SYingwei Zheng
155542a3cb9SYingwei Zhengdefine i1 @test6(double %x) {
156542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test6(
157542a3cb9SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) {
158542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
159542a3cb9SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00
160542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]
161542a3cb9SYingwei Zheng; CHECK:       land.rhs:
162542a3cb9SYingwei Zheng; CHECK-NEXT:    [[CMP_I:%.*]] = fcmp oeq double [[X]], 0x7FF0000000000000
163542a3cb9SYingwei Zheng; CHECK-NEXT:    br label [[LAND_END]]
164542a3cb9SYingwei Zheng; CHECK:       land.end:
165542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP_I]], [[LAND_RHS]] ]
166542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
167542a3cb9SYingwei Zheng;
168542a3cb9SYingwei Zhengentry:
169542a3cb9SYingwei Zheng  %cmp = fcmp ogt double %x, 0.000000e+00
170542a3cb9SYingwei Zheng  br i1 %cmp, label %land.rhs, label %land.end
171542a3cb9SYingwei Zheng
172542a3cb9SYingwei Zhengland.rhs:
173542a3cb9SYingwei Zheng  %abs = tail call double @llvm.fabs.f64(double %x)
174542a3cb9SYingwei Zheng  %and.i = bitcast double %abs to i64
175542a3cb9SYingwei Zheng  %cmp.i = icmp eq i64 %and.i, 9218868437227405312
176542a3cb9SYingwei Zheng  br label %land.end
177542a3cb9SYingwei Zheng
178542a3cb9SYingwei Zhengland.end:
179542a3cb9SYingwei Zheng  %ret = phi i1 [ false, %entry ], [ %cmp.i, %land.rhs ]
180542a3cb9SYingwei Zheng  ret i1 %ret
181542a3cb9SYingwei Zheng}
182542a3cb9SYingwei Zheng
183542a3cb9SYingwei Zhengdefine i1 @test7(float %x) {
184542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test7(
185542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
186542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 345)
187542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
188542a3cb9SYingwei Zheng; CHECK:       if.then:
189542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 328)
190542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET1]]
191542a3cb9SYingwei Zheng; CHECK:       if.else:
192542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 128)
193542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET2]]
194542a3cb9SYingwei Zheng;
195542a3cb9SYingwei Zheng  %cond = call i1 @llvm.is.fpclass.f32(float %x, i32 345)
196542a3cb9SYingwei Zheng  br i1 %cond, label %if.then, label %if.else
197542a3cb9SYingwei Zhengif.then:
198542a3cb9SYingwei Zheng  %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)
199542a3cb9SYingwei Zheng  ret i1 %ret1
200542a3cb9SYingwei Zhengif.else:
201542a3cb9SYingwei Zheng  %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)
202542a3cb9SYingwei Zheng  ret i1 %ret2
203542a3cb9SYingwei Zheng}
204542a3cb9SYingwei Zheng
205542a3cb9SYingwei Zheng; TODO: These two is.fpclass can be simplified.
206542a3cb9SYingwei Zhengdefine i1 @test8(float %x) {
207542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test8(
208542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
209542a3cb9SYingwei Zheng; CHECK-NEXT:    [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
210542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000
211542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
212542a3cb9SYingwei Zheng; CHECK:       if.then:
213db3bbe03SNoah Goldstein; CHECK-NEXT:    ret i1 true
214542a3cb9SYingwei Zheng; CHECK:       if.else:
215db3bbe03SNoah Goldstein; CHECK-NEXT:    [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 59)
216542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET2]]
217542a3cb9SYingwei Zheng;
218542a3cb9SYingwei Zheng  %abs = call float @llvm.fabs.f32(float %x)
219542a3cb9SYingwei Zheng  %cond = fcmp oeq float %abs, 0x7FF0000000000000
220542a3cb9SYingwei Zheng  br i1 %cond, label %if.then, label %if.else
221542a3cb9SYingwei Zhengif.then:
222542a3cb9SYingwei Zheng  %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)
223542a3cb9SYingwei Zheng  ret i1 %ret1
224542a3cb9SYingwei Zhengif.else:
225542a3cb9SYingwei Zheng  %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)
226542a3cb9SYingwei Zheng  ret i1 %ret2
227542a3cb9SYingwei Zheng}
228542a3cb9SYingwei Zheng
229542a3cb9SYingwei Zhengdefine i1 @test9(float %x) {
230542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test9(
231542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
232542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
233542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
234542a3cb9SYingwei Zheng; CHECK:       if.then:
235542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
236542a3cb9SYingwei Zheng; CHECK:       if.else:
237542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
238542a3cb9SYingwei Zheng;
239542a3cb9SYingwei Zheng  %cond = fcmp olt float %x, -1.0
240542a3cb9SYingwei Zheng  br i1 %cond, label %if.then, label %if.else
241542a3cb9SYingwei Zhengif.then:
242542a3cb9SYingwei Zheng  %ret1 = fcmp oeq float %x, 0x7FF0000000000000
243542a3cb9SYingwei Zheng  ret i1 %ret1
244542a3cb9SYingwei Zhengif.else:
245542a3cb9SYingwei Zheng  ret i1 false
246542a3cb9SYingwei Zheng}
247542a3cb9SYingwei Zheng
248542a3cb9SYingwei Zhengdefine i1 @test10(float %x) {
249542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test10(
250542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) {
251542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
252542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
253542a3cb9SYingwei Zheng; CHECK:       if.then:
254542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
255542a3cb9SYingwei Zheng; CHECK:       if.else:
256542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
257542a3cb9SYingwei Zheng;
258542a3cb9SYingwei Zheng  %cond = fcmp olt float %x, -1.0
259542a3cb9SYingwei Zheng  %neg = fneg float %x
260542a3cb9SYingwei Zheng  br i1 %cond, label %if.then, label %if.else
261542a3cb9SYingwei Zhengif.then:
262542a3cb9SYingwei Zheng  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000
263542a3cb9SYingwei Zheng  ret i1 %ret1
264542a3cb9SYingwei Zhengif.else:
265542a3cb9SYingwei Zheng  ret i1 false
266542a3cb9SYingwei Zheng}
267542a3cb9SYingwei Zheng
268542a3cb9SYingwei Zhengdefine i1 @test11_and(float %x, i1 %cond2) {
269542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test11_and(
270542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {
271542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00
272542a3cb9SYingwei Zheng; CHECK-NEXT:    [[AND:%.*]] = and i1 [[COND]], [[COND2]]
273542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
274542a3cb9SYingwei Zheng; CHECK:       if.then:
27516ec5349SYingwei Zheng; CHECK-NEXT:    ret i1 false
276542a3cb9SYingwei Zheng; CHECK:       if.else:
277542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
278542a3cb9SYingwei Zheng;
279542a3cb9SYingwei Zheng  %cond = fcmp olt float %x, -1.0
280542a3cb9SYingwei Zheng  %neg = fneg float %x
281542a3cb9SYingwei Zheng  %and = and i1 %cond, %cond2
282542a3cb9SYingwei Zheng  br i1 %and, label %if.then, label %if.else
283542a3cb9SYingwei Zhengif.then:
284542a3cb9SYingwei Zheng  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000
285542a3cb9SYingwei Zheng  ret i1 %ret1
286542a3cb9SYingwei Zhengif.else:
287542a3cb9SYingwei Zheng  ret i1 false
288542a3cb9SYingwei Zheng}
289542a3cb9SYingwei Zheng
290542a3cb9SYingwei Zhengdefine i1 @test12_or(float %x, i1 %cond2) {
291542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test12_or(
292542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {
293542a3cb9SYingwei Zheng; CHECK-NEXT:  entry:
294542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
295542a3cb9SYingwei Zheng; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND]], [[COND2]]
296542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
297542a3cb9SYingwei Zheng; CHECK:       if.then:
298542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
299542a3cb9SYingwei Zheng; CHECK:       if.else:
30016ec5349SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780)
301542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
302542a3cb9SYingwei Zheng;
303542a3cb9SYingwei Zhengentry:
304542a3cb9SYingwei Zheng  %cond = fcmp ueq float %x, 0.000000e+00
305542a3cb9SYingwei Zheng  %or = or i1 %cond, %cond2
306542a3cb9SYingwei Zheng  br i1 %or, label %if.then, label %if.else
307542a3cb9SYingwei Zheng
308542a3cb9SYingwei Zhengif.then:
309542a3cb9SYingwei Zheng  ret i1 false
310542a3cb9SYingwei Zheng
311542a3cb9SYingwei Zhengif.else:
312542a3cb9SYingwei Zheng  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
313542a3cb9SYingwei Zheng  ret i1 %ret
314542a3cb9SYingwei Zheng}
315542a3cb9SYingwei Zheng
316542a3cb9SYingwei Zhengdefine i1 @test1_no_dominating(float %x, i1 %c) {
317542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test1_no_dominating(
318542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) {
319542a3cb9SYingwei Zheng; CHECK-NEXT:  entry0:
320542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[C]], label [[ENTRY:%.*]], label [[IF_ELSE:%.*]]
321542a3cb9SYingwei Zheng; CHECK:       entry:
322542a3cb9SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
323542a3cb9SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE]]
324542a3cb9SYingwei Zheng; CHECK:       if.then:
325542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 false
326542a3cb9SYingwei Zheng; CHECK:       if.else:
327542a3cb9SYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783)
328542a3cb9SYingwei Zheng; CHECK-NEXT:    ret i1 [[RET]]
329542a3cb9SYingwei Zheng;
330542a3cb9SYingwei Zhengentry0:
331542a3cb9SYingwei Zheng  br i1 %c, label %entry, label %if.else
332542a3cb9SYingwei Zheng
333542a3cb9SYingwei Zhengentry:
334542a3cb9SYingwei Zheng  %cond = fcmp ueq float %x, 0.000000e+00
335542a3cb9SYingwei Zheng  br i1 %cond, label %if.then, label %if.else
336542a3cb9SYingwei Zheng
337542a3cb9SYingwei Zhengif.then:
338542a3cb9SYingwei Zheng  ret i1 false
339542a3cb9SYingwei Zheng
340542a3cb9SYingwei Zhengif.else:
341542a3cb9SYingwei Zheng  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
342542a3cb9SYingwei Zheng  ret i1 %ret
343542a3cb9SYingwei Zheng}
34416a0629eSYingwei Zheng
34516a0629eSYingwei Zhengdefine float @test_signbit_check(float %x, i1 %cond) {
34616a0629eSYingwei Zheng; CHECK-LABEL: define float @test_signbit_check(
34716a0629eSYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {
34816a0629eSYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[X]] to i32
34916a0629eSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0
35016a0629eSYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
35116a0629eSYingwei Zheng; CHECK:       if.then1:
35216a0629eSYingwei Zheng; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]
35316a0629eSYingwei Zheng; CHECK-NEXT:    br label [[IF_END:%.*]]
35416a0629eSYingwei Zheng; CHECK:       if.else:
35516a0629eSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
35616a0629eSYingwei Zheng; CHECK:       if.then2:
35716a0629eSYingwei Zheng; CHECK-NEXT:    br label [[IF_END]]
35816a0629eSYingwei Zheng; CHECK:       if.end:
35916a0629eSYingwei Zheng; CHECK-NEXT:    [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
36016a0629eSYingwei Zheng; CHECK-NEXT:    ret float [[VALUE]]
36116a0629eSYingwei Zheng;
36216a0629eSYingwei Zheng  %i32 = bitcast float %x to i32
36316a0629eSYingwei Zheng  %cmp = icmp slt i32 %i32, 0
36416a0629eSYingwei Zheng  br i1 %cmp, label %if.then1, label %if.else
36516a0629eSYingwei Zheng
36616a0629eSYingwei Zhengif.then1:
36716a0629eSYingwei Zheng  %fneg = fneg float %x
36816a0629eSYingwei Zheng  br label %if.end
36916a0629eSYingwei Zheng
37016a0629eSYingwei Zhengif.else:
37116a0629eSYingwei Zheng  br i1 %cond, label %if.then2, label %if.end
37216a0629eSYingwei Zheng
37316a0629eSYingwei Zhengif.then2:
37416a0629eSYingwei Zheng  br label %if.end
37516a0629eSYingwei Zheng
37616a0629eSYingwei Zhengif.end:
37716a0629eSYingwei Zheng  %value = phi float [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ]
37816a0629eSYingwei Zheng  %ret = call float @llvm.fabs.f32(float %value)
37916a0629eSYingwei Zheng  ret float %ret
38016a0629eSYingwei Zheng}
38116a0629eSYingwei Zheng
38216a0629eSYingwei Zhengdefine float @test_signbit_check_fail(float %x, i1 %cond) {
38316a0629eSYingwei Zheng; CHECK-LABEL: define float @test_signbit_check_fail(
38416a0629eSYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {
38516a0629eSYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[X]] to i32
38616a0629eSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0
38716a0629eSYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
38816a0629eSYingwei Zheng; CHECK:       if.then1:
38916a0629eSYingwei Zheng; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]
39016a0629eSYingwei Zheng; CHECK-NEXT:    br label [[IF_END:%.*]]
39116a0629eSYingwei Zheng; CHECK:       if.else:
39216a0629eSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
39316a0629eSYingwei Zheng; CHECK:       if.then2:
39416a0629eSYingwei Zheng; CHECK-NEXT:    [[FNEG2:%.*]] = fneg float [[X]]
39516a0629eSYingwei Zheng; CHECK-NEXT:    br label [[IF_END]]
39616a0629eSYingwei Zheng; CHECK:       if.end:
39716a0629eSYingwei Zheng; CHECK-NEXT:    [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[FNEG2]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
39816a0629eSYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]])
39916a0629eSYingwei Zheng; CHECK-NEXT:    ret float [[RET]]
40016a0629eSYingwei Zheng;
40116a0629eSYingwei Zheng  %i32 = bitcast float %x to i32
40216a0629eSYingwei Zheng  %cmp = icmp slt i32 %i32, 0
40316a0629eSYingwei Zheng  br i1 %cmp, label %if.then1, label %if.else
40416a0629eSYingwei Zheng
40516a0629eSYingwei Zhengif.then1:
40616a0629eSYingwei Zheng  %fneg = fneg float %x
40716a0629eSYingwei Zheng  br label %if.end
40816a0629eSYingwei Zheng
40916a0629eSYingwei Zhengif.else:
41016a0629eSYingwei Zheng  br i1 %cond, label %if.then2, label %if.end
41116a0629eSYingwei Zheng
41216a0629eSYingwei Zhengif.then2:
41316a0629eSYingwei Zheng  %fneg2 = fneg float %x
41416a0629eSYingwei Zheng  br label %if.end
41516a0629eSYingwei Zheng
41616a0629eSYingwei Zhengif.end:
41716a0629eSYingwei Zheng  %value = phi float [ %fneg, %if.then1 ], [ %fneg2, %if.then2 ], [ %x, %if.else ]
41816a0629eSYingwei Zheng  %ret = call float @llvm.fabs.f32(float %value)
41916a0629eSYingwei Zheng  ret float %ret
42016a0629eSYingwei Zheng}
42116a0629eSYingwei Zheng
42216a0629eSYingwei Zhengdefine <2 x float> @test_signbit_check_wrong_type(<2 x float> %x, i1 %cond) {
42316a0629eSYingwei Zheng; CHECK-LABEL: define <2 x float> @test_signbit_check_wrong_type(
42416a0629eSYingwei Zheng; CHECK-SAME: <2 x float> [[X:%.*]], i1 [[COND:%.*]]) {
42516a0629eSYingwei Zheng; CHECK-NEXT:    [[I32:%.*]] = bitcast <2 x float> [[X]] to i64
42616a0629eSYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I32]], 0
42716a0629eSYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
42816a0629eSYingwei Zheng; CHECK:       if.then1:
42916a0629eSYingwei Zheng; CHECK-NEXT:    [[FNEG:%.*]] = fneg <2 x float> [[X]]
43016a0629eSYingwei Zheng; CHECK-NEXT:    br label [[IF_END:%.*]]
43116a0629eSYingwei Zheng; CHECK:       if.else:
43216a0629eSYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
43316a0629eSYingwei Zheng; CHECK:       if.then2:
43416a0629eSYingwei Zheng; CHECK-NEXT:    br label [[IF_END]]
43516a0629eSYingwei Zheng; CHECK:       if.end:
43616a0629eSYingwei Zheng; CHECK-NEXT:    [[VALUE:%.*]] = phi <2 x float> [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
43716a0629eSYingwei Zheng; CHECK-NEXT:    [[RET:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VALUE]])
43816a0629eSYingwei Zheng; CHECK-NEXT:    ret <2 x float> [[RET]]
43916a0629eSYingwei Zheng;
44016a0629eSYingwei Zheng  %i32 = bitcast <2 x float> %x to i64
44116a0629eSYingwei Zheng  %cmp = icmp slt i64 %i32, 0
44216a0629eSYingwei Zheng  br i1 %cmp, label %if.then1, label %if.else
44316a0629eSYingwei Zheng
44416a0629eSYingwei Zhengif.then1:
44516a0629eSYingwei Zheng  %fneg = fneg <2 x float> %x
44616a0629eSYingwei Zheng  br label %if.end
44716a0629eSYingwei Zheng
44816a0629eSYingwei Zhengif.else:
44916a0629eSYingwei Zheng  br i1 %cond, label %if.then2, label %if.end
45016a0629eSYingwei Zheng
45116a0629eSYingwei Zhengif.then2:
45216a0629eSYingwei Zheng  br label %if.end
45316a0629eSYingwei Zheng
45416a0629eSYingwei Zhengif.end:
45516a0629eSYingwei Zheng  %value = phi <2 x float> [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ]
45616a0629eSYingwei Zheng  %ret = call <2 x float> @llvm.fabs.v2f32(<2 x float> %value)
45716a0629eSYingwei Zheng  ret <2 x float> %ret
45816a0629eSYingwei Zheng}
459*a67bd94fSYingwei Zheng
460*a67bd94fSYingwei Zhengdefine i1 @pr118257(half %v0, half %v1) {
461*a67bd94fSYingwei Zheng; CHECK-LABEL: define i1 @pr118257(
462*a67bd94fSYingwei Zheng; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) {
463*a67bd94fSYingwei Zheng; CHECK-NEXT:  entry:
464*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000
465*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CAST0:%.*]] = bitcast half [[V0]] to i16
466*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i16 [[CAST0]], 0
467*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]]
468*a67bd94fSYingwei Zheng; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]
469*a67bd94fSYingwei Zheng; CHECK:       if.else:
470*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CAST1:%.*]] = bitcast half [[V1]] to i16
471*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0
472*a67bd94fSYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP3]]
473*a67bd94fSYingwei Zheng; CHECK:       if.end:
474*a67bd94fSYingwei Zheng; CHECK-NEXT:    ret i1 false
475*a67bd94fSYingwei Zheng;
476*a67bd94fSYingwei Zhengentry:
477*a67bd94fSYingwei Zheng  %cmp1 = fcmp une half %v1, 0.000000e+00
478*a67bd94fSYingwei Zheng  %cast0 = bitcast half %v0 to i16
479*a67bd94fSYingwei Zheng  %cmp2 = icmp slt i16 %cast0, 0
480*a67bd94fSYingwei Zheng  %or.cond = or i1 %cmp1, %cmp2
481*a67bd94fSYingwei Zheng  br i1 %or.cond, label %if.end, label %if.else
482*a67bd94fSYingwei Zheng
483*a67bd94fSYingwei Zhengif.else:
484*a67bd94fSYingwei Zheng  %cast1 = bitcast half %v1 to i16
485*a67bd94fSYingwei Zheng  %cmp3 = icmp slt i16 %cast1, 0
486*a67bd94fSYingwei Zheng  ret i1 %cmp3
487*a67bd94fSYingwei Zheng
488*a67bd94fSYingwei Zhengif.end:
489*a67bd94fSYingwei Zheng  ret i1 false
490*a67bd94fSYingwei Zheng}
491*a67bd94fSYingwei Zheng
492*a67bd94fSYingwei Zhengdefine i1 @pr118257_is_fpclass(half %v0, half %v1) {
493*a67bd94fSYingwei Zheng; CHECK-LABEL: define i1 @pr118257_is_fpclass(
494*a67bd94fSYingwei Zheng; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) {
495*a67bd94fSYingwei Zheng; CHECK-NEXT:  entry:
496*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000
497*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.is.fpclass.f16(half [[V0]], i32 35)
498*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]]
499*a67bd94fSYingwei Zheng; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]
500*a67bd94fSYingwei Zheng; CHECK:       if.else:
501*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CAST1:%.*]] = bitcast half [[V1]] to i16
502*a67bd94fSYingwei Zheng; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0
503*a67bd94fSYingwei Zheng; CHECK-NEXT:    ret i1 [[CMP3]]
504*a67bd94fSYingwei Zheng; CHECK:       if.end:
505*a67bd94fSYingwei Zheng; CHECK-NEXT:    ret i1 false
506*a67bd94fSYingwei Zheng;
507*a67bd94fSYingwei Zhengentry:
508*a67bd94fSYingwei Zheng  %cmp1 = fcmp une half %v1, 0.000000e+00
509*a67bd94fSYingwei Zheng  %cmp2 = call i1 @llvm.is.fpclass.half(half %v0, i32 35)
510*a67bd94fSYingwei Zheng  %or.cond = or i1 %cmp1, %cmp2
511*a67bd94fSYingwei Zheng  br i1 %or.cond, label %if.end, label %if.else
512*a67bd94fSYingwei Zheng
513*a67bd94fSYingwei Zhengif.else:
514*a67bd94fSYingwei Zheng  %cast1 = bitcast half %v1 to i16
515*a67bd94fSYingwei Zheng  %cmp3 = icmp slt i16 %cast1, 0
516*a67bd94fSYingwei Zheng  ret i1 %cmp3
517*a67bd94fSYingwei Zheng
518*a67bd94fSYingwei Zhengif.end:
519*a67bd94fSYingwei Zheng  ret i1 false
520*a67bd94fSYingwei Zheng}
521