1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12; RUN: opt -passes=gvn -S < %s | FileCheck %s
23
34define i32 @f1 (i32 %x ) {
4- ; CHECK-LABEL: define i32 @f1(
5+ ; CHECK-LABEL: define i32 @f1(
6+ ; CHECK-SAME: i32 [[X:%.*]]) {
7+ ; CHECK-NEXT: [[BB0:.*:]]
8+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 0
9+ ; CHECK-NEXT: br i1 [[CMP]], label %[[BB2:.*]], label %[[BB1:.*]]
10+ ; CHECK: [[BB1]]:
11+ ; CHECK-NEXT: br label %[[BB2]]
12+ ; CHECK: [[BB2]]:
13+ ; CHECK-NEXT: ret i32 [[X]]
14+ ;
515bb0:
616 %cmp = icmp eq i32 %x , 0
717 br i1 %cmp , label %bb2 , label %bb1
1121 %cond = phi i32 [ %x , %bb0 ], [ 0 , %bb1 ]
1222 %foo = add i32 %cond , %x
1323 ret i32 %foo
14- ; CHECK: bb2:
15- ; CHECK: ret i32 %x
1624}
1725
1826define i32 @f2 (i32 %x ) {
19- ; CHECK-LABEL: define i32 @f2(
27+ ; CHECK-LABEL: define i32 @f2(
28+ ; CHECK-SAME: i32 [[X:%.*]]) {
29+ ; CHECK-NEXT: [[BB0:.*:]]
30+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], 0
31+ ; CHECK-NEXT: br i1 [[CMP]], label %[[BB1:.*]], label %[[BB2:.*]]
32+ ; CHECK: [[BB1]]:
33+ ; CHECK-NEXT: br label %[[BB2]]
34+ ; CHECK: [[BB2]]:
35+ ; CHECK-NEXT: ret i32 [[X]]
36+ ;
2037bb0:
2138 %cmp = icmp ne i32 %x , 0
2239 br i1 %cmp , label %bb1 , label %bb2
2643 %cond = phi i32 [ %x , %bb0 ], [ 0 , %bb1 ]
2744 %foo = add i32 %cond , %x
2845 ret i32 %foo
29- ; CHECK: bb2:
30- ; CHECK: ret i32 %x
3146}
3247
3348define i32 @f3 (i32 %x ) {
34- ; CHECK-LABEL: define i32 @f3(
49+ ; CHECK-LABEL: define i32 @f3(
50+ ; CHECK-SAME: i32 [[X:%.*]]) {
51+ ; CHECK-NEXT: [[BB0:.*:]]
52+ ; CHECK-NEXT: switch i32 [[X]], label %[[BB1:.*]] [
53+ ; CHECK-NEXT: i32 0, label %[[BB2:.*]]
54+ ; CHECK-NEXT: ]
55+ ; CHECK: [[BB1]]:
56+ ; CHECK-NEXT: br label %[[BB2]]
57+ ; CHECK: [[BB2]]:
58+ ; CHECK-NEXT: ret i32 [[X]]
59+ ;
3560bb0:
3661 switch i32 %x , label %bb1 [ i32 0 , label %bb2 ]
3762bb1:
4065 %cond = phi i32 [ %x , %bb0 ], [ 0 , %bb1 ]
4166 %foo = add i32 %cond , %x
4267 ret i32 %foo
43- ; CHECK: bb2:
44- ; CHECK: ret i32 %x
4568}
4669
4770declare void @g (i1 )
4871define void @f4 (ptr %x ) {
4972; CHECK-LABEL: define void @f4(
73+ ; CHECK-SAME: ptr [[X:%.*]]) {
74+ ; CHECK-NEXT: [[BB0:.*:]]
75+ ; CHECK-NEXT: [[Y:%.*]] = icmp eq ptr null, [[X]]
76+ ; CHECK-NEXT: br i1 [[Y]], label %[[BB2:.*]], label %[[BB1:.*]]
77+ ; CHECK: [[BB1]]:
78+ ; CHECK-NEXT: br label %[[BB2]]
79+ ; CHECK: [[BB2]]:
80+ ; CHECK-NEXT: call void @g(i1 [[Y]])
81+ ; CHECK-NEXT: ret void
82+ ;
5083bb0:
5184 %y = icmp eq ptr null , %x
5285 br i1 %y , label %bb2 , label %bb1
5588bb2:
5689 %zed = icmp eq ptr null , %x
5790 call void @g (i1 %zed )
58- ; CHECK: call void @g(i1 %y)
5991 ret void
6092}
6193
6294define double @fcmp_oeq_not_zero (double %x , double %y ) {
95+ ; CHECK-LABEL: define double @fcmp_oeq_not_zero(
96+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
97+ ; CHECK-NEXT: [[ENTRY:.*]]:
98+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 2.000000e+00
99+ ; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
100+ ; CHECK: [[IF]]:
101+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
102+ ; CHECK-NEXT: br label %[[RETURN]]
103+ ; CHECK: [[RETURN]]:
104+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
105+ ; CHECK-NEXT: ret double [[RETVAL]]
106+ ;
63107entry:
64108 %cmp = fcmp oeq double %y , 2 .0
65109 br i1 %cmp , label %if , label %return
71115return:
72116 %retval = phi double [ %div , %if ], [ %x , %entry ]
73117 ret double %retval
74-
75- ; CHECK-LABEL: define double @fcmp_oeq_not_zero(
76- ; CHECK: %div = fdiv double %x, 2.0
77118}
78119
79120define double @fcmp_une_not_zero (double %x , double %y ) {
121+ ; CHECK-LABEL: define double @fcmp_une_not_zero(
122+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
123+ ; CHECK-NEXT: [[ENTRY:.*]]:
124+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], 2.000000e+00
125+ ; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
126+ ; CHECK: [[ELSE]]:
127+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
128+ ; CHECK-NEXT: br label %[[RETURN]]
129+ ; CHECK: [[RETURN]]:
130+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
131+ ; CHECK-NEXT: ret double [[RETVAL]]
132+ ;
80133entry:
81134 %cmp = fcmp une double %y , 2 .0
82135 br i1 %cmp , label %return , label %else
@@ -88,12 +141,21 @@ else:
88141return:
89142 %retval = phi double [ %div , %else ], [ %x , %entry ]
90143 ret double %retval
91-
92- ; CHECK-LABEL: define double @fcmp_une_not_zero(
93- ; CHECK: %div = fdiv double %x, 2.0
94144}
95145
96146define double @fcmp_one_possibly_nan (double %x , double %y ) {
147+ ; CHECK-LABEL: define double @fcmp_one_possibly_nan(
148+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
149+ ; CHECK-NEXT: [[ENTRY:.*]]:
150+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp one double [[Y]], 2.000000e+00
151+ ; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
152+ ; CHECK: [[ELSE]]:
153+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
154+ ; CHECK-NEXT: br label %[[RETURN]]
155+ ; CHECK: [[RETURN]]:
156+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
157+ ; CHECK-NEXT: ret double [[RETVAL]]
158+ ;
97159entry:
98160 %cmp = fcmp one double %y , 2 .0
99161 br i1 %cmp , label %return , label %else
@@ -105,12 +167,21 @@ else:
105167return:
106168 %retval = phi double [ %div , %else ], [ %x , %entry ]
107169 ret double %retval
108-
109- ; CHECK-LABEL: define double @fcmp_one_possibly_nan(
110- ; CHECK: %div = fdiv double %x, %y
111170}
112171
113172define double @fcmp_one_not_zero_or_nan (double %x , double %y ) {
173+ ; CHECK-LABEL: define double @fcmp_one_not_zero_or_nan(
174+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
175+ ; CHECK-NEXT: [[ENTRY:.*]]:
176+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan one double [[Y]], 2.000000e+00
177+ ; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
178+ ; CHECK: [[ELSE]]:
179+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
180+ ; CHECK-NEXT: br label %[[RETURN]]
181+ ; CHECK: [[RETURN]]:
182+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
183+ ; CHECK-NEXT: ret double [[RETVAL]]
184+ ;
114185entry:
115186 %cmp = fcmp nnan one double %y , 2 .0
116187 br i1 %cmp , label %return , label %else
@@ -122,15 +193,24 @@ else:
122193return:
123194 %retval = phi double [ %div , %else ], [ %x , %entry ]
124195 ret double %retval
125-
126- ; CHECK-LABEL: define double @fcmp_one_not_zero_or_nan(
127- ; CHECK: %div = fdiv double %x, 2.0
128196}
129197
130- ; PR22376 - We can't propagate zero constants because -0.0
198+ ; PR22376 - We can't propagate zero constants because -0.0
131199; compares equal to 0.0. If %y is -0.0 in this test case,
132200; we would produce the wrong sign on the infinity return value.
133201define double @fcmp_oeq_zero (double %x , double %y ) {
202+ ; CHECK-LABEL: define double @fcmp_oeq_zero(
203+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
204+ ; CHECK-NEXT: [[ENTRY:.*]]:
205+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
206+ ; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
207+ ; CHECK: [[IF]]:
208+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
209+ ; CHECK-NEXT: br label %[[RETURN]]
210+ ; CHECK: [[RETURN]]:
211+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
212+ ; CHECK-NEXT: ret double [[RETVAL]]
213+ ;
134214entry:
135215 %cmp = fcmp oeq double %y , 0 .0
136216 br i1 %cmp , label %if , label %return
@@ -142,12 +222,21 @@ if:
142222return:
143223 %retval = phi double [ %div , %if ], [ %x , %entry ]
144224 ret double %retval
145-
146- ; CHECK-LABEL: define double @fcmp_oeq_zero(
147- ; CHECK: %div = fdiv double %x, %y
148225}
149226
150227define double @fcmp_une_zero (double %x , double %y ) {
228+ ; CHECK-LABEL: define double @fcmp_une_zero(
229+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
230+ ; CHECK-NEXT: [[ENTRY:.*]]:
231+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], -0.000000e+00
232+ ; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
233+ ; CHECK: [[ELSE]]:
234+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
235+ ; CHECK-NEXT: br label %[[RETURN]]
236+ ; CHECK: [[RETURN]]:
237+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
238+ ; CHECK-NEXT: ret double [[RETVAL]]
239+ ;
151240entry:
152241 %cmp = fcmp une double %y , -0 .0
153242 br i1 %cmp , label %return , label %else
@@ -159,52 +248,81 @@ else:
159248return:
160249 %retval = phi double [ %div , %else ], [ %x , %entry ]
161250 ret double %retval
162-
163- ; CHECK-LABEL: define double @fcmp_une_zero(
164- ; CHECK: %div = fdiv double %x, %y
165251}
166252
167253; We also cannot propagate a value if it's not a constant.
168254; This is because the value could be 0.0 or -0.0.
169255
170256define double @fcmp_oeq_maybe_zero (double %x , double %y , double %z1 , double %z2 ) {
257+ ; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
258+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]], double [[Z1:%.*]], double [[Z2:%.*]]) {
259+ ; CHECK-NEXT: [[ENTRY:.*]]:
260+ ; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1]], [[Z2]]
261+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], [[Z]]
262+ ; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
263+ ; CHECK: [[IF]]:
264+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Z]]
265+ ; CHECK-NEXT: br label %[[RETURN]]
266+ ; CHECK: [[RETURN]]:
267+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
268+ ; CHECK-NEXT: ret double [[RETVAL]]
269+ ;
171270entry:
172- %z = fadd double %z1 , %z2
173- %cmp = fcmp oeq double %y , %z
174- br i1 %cmp , label %if , label %return
271+ %z = fadd double %z1 , %z2
272+ %cmp = fcmp oeq double %y , %z
273+ br i1 %cmp , label %if , label %return
175274
176275if:
177- %div = fdiv double %x , %z
178- br label %return
276+ %div = fdiv double %x , %z
277+ br label %return
179278
180279return:
181- %retval = phi double [ %div , %if ], [ %x , %entry ]
182- ret double %retval
183-
184- ; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
185- ; CHECK: %div = fdiv double %x, %z
280+ %retval = phi double [ %div , %if ], [ %x , %entry ]
281+ ret double %retval
186282}
187283
188284define double @fcmp_une_maybe_zero (double %x , double %y , double %z1 , double %z2 ) {
285+ ; CHECK-LABEL: define double @fcmp_une_maybe_zero(
286+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]], double [[Z1:%.*]], double [[Z2:%.*]]) {
287+ ; CHECK-NEXT: [[ENTRY:.*]]:
288+ ; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1]], [[Z2]]
289+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], [[Z]]
290+ ; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
291+ ; CHECK: [[ELSE]]:
292+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Z]]
293+ ; CHECK-NEXT: br label %[[RETURN]]
294+ ; CHECK: [[RETURN]]:
295+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
296+ ; CHECK-NEXT: ret double [[RETVAL]]
297+ ;
189298entry:
190- %z = fadd double %z1 , %z2
191- %cmp = fcmp une double %y , %z
192- br i1 %cmp , label %return , label %else
299+ %z = fadd double %z1 , %z2
300+ %cmp = fcmp une double %y , %z
301+ br i1 %cmp , label %return , label %else
193302
194303else:
195- %div = fdiv double %x , %z
196- br label %return
304+ %div = fdiv double %x , %z
305+ br label %return
197306
198307return:
199- %retval = phi double [ %div , %else ], [ %x , %entry ]
200- ret double %retval
201-
202- ; CHECK-LABEL: define double @fcmp_une_maybe_zero(
203- ; CHECK: %div = fdiv double %x, %z
308+ %retval = phi double [ %div , %else ], [ %x , %entry ]
309+ ret double %retval
204310}
205311
206312
207313define double @fcmp_ueq_possibly_nan (double %x , double %y ) {
314+ ; CHECK-LABEL: define double @fcmp_ueq_possibly_nan(
315+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
316+ ; CHECK-NEXT: [[ENTRY:.*]]:
317+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq double [[Y]], 2.000000e+00
318+ ; CHECK-NEXT: br i1 [[CMP]], label %[[DO_DIV:.*]], label %[[RETURN:.*]]
319+ ; CHECK: [[DO_DIV]]:
320+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
321+ ; CHECK-NEXT: br label %[[RETURN]]
322+ ; CHECK: [[RETURN]]:
323+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[DO_DIV]] ], [ [[X]], %[[ENTRY]] ]
324+ ; CHECK-NEXT: ret double [[RETVAL]]
325+ ;
208326entry:
209327 %cmp = fcmp ueq double %y , 2 .0
210328 br i1 %cmp , label %do_div , label %return
@@ -216,12 +334,21 @@ do_div:
216334return:
217335 %retval = phi double [ %div , %do_div ], [ %x , %entry ]
218336 ret double %retval
219-
220- ; CHECK-LABEL: define double @fcmp_ueq_possibly_nan(
221- ; CHECK: %div = fdiv double %x, %y
222337}
223338
224339define double @fcmp_ueq_not_zero_or_nan (double %x , double %y ) {
340+ ; CHECK-LABEL: define double @fcmp_ueq_not_zero_or_nan(
341+ ; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
342+ ; CHECK-NEXT: [[ENTRY:.*]]:
343+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ueq double [[Y]], 2.000000e+00
344+ ; CHECK-NEXT: br i1 [[CMP]], label %[[DO_DIV:.*]], label %[[RETURN:.*]]
345+ ; CHECK: [[DO_DIV]]:
346+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
347+ ; CHECK-NEXT: br label %[[RETURN]]
348+ ; CHECK: [[RETURN]]:
349+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[DO_DIV]] ], [ [[X]], %[[ENTRY]] ]
350+ ; CHECK-NEXT: ret double [[RETVAL]]
351+ ;
225352entry:
226353 %cmp = fcmp nnan ueq double %y , 2 .0
227354 br i1 %cmp , label %do_div , label %return
@@ -233,7 +360,4 @@ do_div:
233360return:
234361 %retval = phi double [ %div , %do_div ], [ %x , %entry ]
235362 ret double %retval
236-
237- ; CHECK-LABEL: define double @fcmp_ueq_not_zero_or_nan(
238- ; CHECK: %div = fdiv double %x, 2.0
239363}
0 commit comments