Skip to content

Commit f475b6d

Browse files
committed
[ValueTracking] Add pre-commit tests. NFC.
1 parent 06774d6 commit f475b6d

File tree

1 file changed

+213
-0
lines changed

1 file changed

+213
-0
lines changed
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3+
4+
define i1 @test1(float %x) {
5+
; CHECK-LABEL: define i1 @test1(
6+
; CHECK-SAME: float [[X:%.*]]) {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
9+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
10+
; CHECK: if.then:
11+
; CHECK-NEXT: ret i1 false
12+
; CHECK: if.else:
13+
; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783)
14+
; CHECK-NEXT: ret i1 [[RET]]
15+
;
16+
entry:
17+
%cond = fcmp ueq float %x, 0.000000e+00
18+
br i1 %cond, label %if.then, label %if.else
19+
20+
if.then:
21+
ret i1 false
22+
23+
if.else:
24+
%ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
25+
ret i1 %ret
26+
}
27+
28+
define i1 @test2(double %x) {
29+
; CHECK-LABEL: define i1 @test2(
30+
; CHECK-SAME: double [[X:%.*]]) {
31+
; CHECK-NEXT: entry:
32+
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000
33+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
34+
; CHECK: if.then:
35+
; CHECK-NEXT: ret i1 false
36+
; CHECK: if.end:
37+
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp oeq double [[X]], 0.000000e+00
38+
; CHECK-NEXT: ret i1 [[CMP_I]]
39+
;
40+
entry:
41+
%cmp = fcmp olt double %x, 0x3EB0C6F7A0000000
42+
br i1 %cmp, label %if.then, label %if.end
43+
if.then:
44+
ret i1 false
45+
if.end:
46+
%cmp.i = fcmp oeq double %x, 0.000000e+00
47+
ret i1 %cmp.i
48+
}
49+
50+
define i1 @test3(float %x) {
51+
; CHECK-LABEL: define i1 @test3(
52+
; CHECK-SAME: float [[X:%.*]]) {
53+
; CHECK-NEXT: entry:
54+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 3.000000e+00
55+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
56+
; CHECK: if.then:
57+
; CHECK-NEXT: [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
58+
; CHECK-NEXT: [[RET:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000
59+
; CHECK-NEXT: ret i1 [[RET]]
60+
; CHECK: if.else:
61+
; CHECK-NEXT: ret i1 false
62+
;
63+
entry:
64+
%cmp = fcmp ogt float %x, 3.000000e+00
65+
br i1 %cmp, label %if.then, label %if.else
66+
if.then:
67+
%abs = call float @llvm.fabs.f32(float %x)
68+
%ret = fcmp oeq float %abs, 0x7FF0000000000000
69+
ret i1 %ret
70+
if.else:
71+
ret i1 false
72+
}
73+
74+
define float @test4(float %x) {
75+
; CHECK-LABEL: define float @test4(
76+
; CHECK-SAME: float [[X:%.*]]) {
77+
; CHECK-NEXT: entry:
78+
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X]], 0x3EB0C6F7A0000000
79+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
80+
; CHECK: if.then:
81+
; CHECK-NEXT: ret float 1.000000e+00
82+
; CHECK: if.end:
83+
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp oeq float [[X]], 0.000000e+00
84+
; CHECK-NEXT: [[DIV:%.*]] = fdiv float 1.000000e+00, [[X]]
85+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP_I]], float 1.000000e+00, float [[DIV]]
86+
; CHECK-NEXT: ret float [[RET]]
87+
;
88+
entry:
89+
%cmp = fcmp olt float %x, 0x3EB0C6F7A0000000
90+
br i1 %cmp, label %if.then, label %if.end
91+
92+
if.then:
93+
ret float 1.0
94+
95+
if.end:
96+
%cmp.i = fcmp oeq float %x, 0.000000e+00
97+
%div = fdiv float 1.000000e+00, %x
98+
%ret = select i1 %cmp.i, float 1.000000e+00, float %div
99+
ret float %ret
100+
}
101+
102+
define i1 @test5(double %x, i1 %cond) {
103+
; CHECK-LABEL: define i1 @test5(
104+
; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {
105+
; CHECK-NEXT: entry:
106+
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
107+
; CHECK: if:
108+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno double [[X]], 0.000000e+00
109+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
110+
; CHECK: if.then:
111+
; CHECK-NEXT: ret i1 false
112+
; CHECK: if.end:
113+
; CHECK-NEXT: br label [[EXIT]]
114+
; CHECK: exit:
115+
; CHECK-NEXT: [[Y:%.*]] = phi double [ -1.000000e+00, [[ENTRY:%.*]] ], [ [[X]], [[IF_END]] ]
116+
; CHECK-NEXT: [[RET:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[Y]], i32 411)
117+
; CHECK-NEXT: ret i1 [[RET]]
118+
;
119+
entry:
120+
br i1 %cond, label %if, label %exit
121+
if:
122+
%cmp = fcmp uno double %x, 0.000000e+00
123+
br i1 %cmp, label %if.then, label %if.end
124+
if.then:
125+
ret i1 false
126+
if.end:
127+
br label %exit
128+
exit:
129+
%y = phi double [ -1.000000e+00, %entry ], [ %x, %if.end ]
130+
%ret = tail call i1 @llvm.is.fpclass.f64(double %y, i32 411)
131+
ret i1 %ret
132+
}
133+
134+
define i1 @test6(double %x) {
135+
; CHECK-LABEL: define i1 @test6(
136+
; CHECK-SAME: double [[X:%.*]]) {
137+
; CHECK-NEXT: entry:
138+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00
139+
; CHECK-NEXT: br i1 [[CMP]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]
140+
; CHECK: land.rhs:
141+
; CHECK-NEXT: [[ABS:%.*]] = tail call double @llvm.fabs.f64(double [[X]])
142+
; CHECK-NEXT: [[AND_I:%.*]] = bitcast double [[ABS]] to i64
143+
; CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i64 [[AND_I]], 9218868437227405312
144+
; CHECK-NEXT: br label [[LAND_END]]
145+
; CHECK: land.end:
146+
; CHECK-NEXT: [[RET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP_I]], [[LAND_RHS]] ]
147+
; CHECK-NEXT: ret i1 [[RET]]
148+
;
149+
entry:
150+
%cmp = fcmp ogt double %x, 0.000000e+00
151+
br i1 %cmp, label %land.rhs, label %land.end
152+
153+
land.rhs:
154+
%abs = tail call double @llvm.fabs.f64(double %x)
155+
%and.i = bitcast double %abs to i64
156+
%cmp.i = icmp eq i64 %and.i, 9218868437227405312
157+
br label %land.end
158+
159+
land.end:
160+
%ret = phi i1 [ false, %entry ], [ %cmp.i, %land.rhs ]
161+
ret i1 %ret
162+
}
163+
164+
define i1 @test7(float %x) {
165+
; CHECK-LABEL: define i1 @test7(
166+
; CHECK-SAME: float [[X:%.*]]) {
167+
; CHECK-NEXT: [[COND:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 345)
168+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
169+
; CHECK: if.then:
170+
; CHECK-NEXT: [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 456)
171+
; CHECK-NEXT: ret i1 [[RET1]]
172+
; CHECK: if.else:
173+
; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 456)
174+
; CHECK-NEXT: ret i1 [[RET2]]
175+
;
176+
%cond = call i1 @llvm.is.fpclass.f32(float %x, i32 345)
177+
br i1 %cond, label %if.then, label %if.else
178+
if.then:
179+
%ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)
180+
ret i1 %ret1
181+
if.else:
182+
%ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)
183+
ret i1 %ret2
184+
}
185+
186+
define i1 @test1_no_dominating(float %x, i1 %c) {
187+
; CHECK-LABEL: define i1 @test1_no_dominating(
188+
; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) {
189+
; CHECK-NEXT: entry0:
190+
; CHECK-NEXT: br i1 [[C]], label [[ENTRY:%.*]], label [[IF_ELSE:%.*]]
191+
; CHECK: entry:
192+
; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00
193+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE]]
194+
; CHECK: if.then:
195+
; CHECK-NEXT: ret i1 false
196+
; CHECK: if.else:
197+
; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783)
198+
; CHECK-NEXT: ret i1 [[RET]]
199+
;
200+
entry0:
201+
br i1 %c, label %entry, label %if.else
202+
203+
entry:
204+
%cond = fcmp ueq float %x, 0.000000e+00
205+
br i1 %cond, label %if.then, label %if.else
206+
207+
if.then:
208+
ret i1 false
209+
210+
if.else:
211+
%ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)
212+
ret i1 %ret
213+
}

0 commit comments

Comments
 (0)