1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: opt -passes=gvn -S < %s | FileCheck %s
2
3
3
4
define 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
+ ;
5
15
bb0:
6
16
%cmp = icmp eq i32 %x , 0
7
17
br i1 %cmp , label %bb2 , label %bb1
11
21
%cond = phi i32 [ %x , %bb0 ], [ 0 , %bb1 ]
12
22
%foo = add i32 %cond , %x
13
23
ret i32 %foo
14
- ; CHECK: bb2:
15
- ; CHECK: ret i32 %x
16
24
}
17
25
18
26
define 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
+ ;
20
37
bb0:
21
38
%cmp = icmp ne i32 %x , 0
22
39
br i1 %cmp , label %bb1 , label %bb2
26
43
%cond = phi i32 [ %x , %bb0 ], [ 0 , %bb1 ]
27
44
%foo = add i32 %cond , %x
28
45
ret i32 %foo
29
- ; CHECK: bb2:
30
- ; CHECK: ret i32 %x
31
46
}
32
47
33
48
define 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
+ ;
35
60
bb0:
36
61
switch i32 %x , label %bb1 [ i32 0 , label %bb2 ]
37
62
bb1:
40
65
%cond = phi i32 [ %x , %bb0 ], [ 0 , %bb1 ]
41
66
%foo = add i32 %cond , %x
42
67
ret i32 %foo
43
- ; CHECK: bb2:
44
- ; CHECK: ret i32 %x
45
68
}
46
69
47
70
declare void @g (i1 )
48
71
define void @f4 (ptr %x ) {
49
72
; 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
+ ;
50
83
bb0:
51
84
%y = icmp eq ptr null , %x
52
85
br i1 %y , label %bb2 , label %bb1
55
88
bb2:
56
89
%zed = icmp eq ptr null , %x
57
90
call void @g (i1 %zed )
58
- ; CHECK: call void @g(i1 %y)
59
91
ret void
60
92
}
61
93
62
94
define 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
+ ;
63
107
entry:
64
108
%cmp = fcmp oeq double %y , 2 .0
65
109
br i1 %cmp , label %if , label %return
71
115
return:
72
116
%retval = phi double [ %div , %if ], [ %x , %entry ]
73
117
ret double %retval
74
-
75
- ; CHECK-LABEL: define double @fcmp_oeq_not_zero(
76
- ; CHECK: %div = fdiv double %x, 2.0
77
118
}
78
119
79
120
define 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
+ ;
80
133
entry:
81
134
%cmp = fcmp une double %y , 2 .0
82
135
br i1 %cmp , label %return , label %else
@@ -88,12 +141,21 @@ else:
88
141
return:
89
142
%retval = phi double [ %div , %else ], [ %x , %entry ]
90
143
ret double %retval
91
-
92
- ; CHECK-LABEL: define double @fcmp_une_not_zero(
93
- ; CHECK: %div = fdiv double %x, 2.0
94
144
}
95
145
96
146
define 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
+ ;
97
159
entry:
98
160
%cmp = fcmp one double %y , 2 .0
99
161
br i1 %cmp , label %return , label %else
@@ -105,12 +167,21 @@ else:
105
167
return:
106
168
%retval = phi double [ %div , %else ], [ %x , %entry ]
107
169
ret double %retval
108
-
109
- ; CHECK-LABEL: define double @fcmp_one_possibly_nan(
110
- ; CHECK: %div = fdiv double %x, %y
111
170
}
112
171
113
172
define 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
+ ;
114
185
entry:
115
186
%cmp = fcmp nnan one double %y , 2 .0
116
187
br i1 %cmp , label %return , label %else
@@ -122,15 +193,24 @@ else:
122
193
return:
123
194
%retval = phi double [ %div , %else ], [ %x , %entry ]
124
195
ret double %retval
125
-
126
- ; CHECK-LABEL: define double @fcmp_one_not_zero_or_nan(
127
- ; CHECK: %div = fdiv double %x, 2.0
128
196
}
129
197
130
- ; PR22376 - We can't propagate zero constants because -0.0
198
+ ; PR22376 - We can't propagate zero constants because -0.0
131
199
; compares equal to 0.0. If %y is -0.0 in this test case,
132
200
; we would produce the wrong sign on the infinity return value.
133
201
define 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
+ ;
134
214
entry:
135
215
%cmp = fcmp oeq double %y , 0 .0
136
216
br i1 %cmp , label %if , label %return
@@ -142,12 +222,21 @@ if:
142
222
return:
143
223
%retval = phi double [ %div , %if ], [ %x , %entry ]
144
224
ret double %retval
145
-
146
- ; CHECK-LABEL: define double @fcmp_oeq_zero(
147
- ; CHECK: %div = fdiv double %x, %y
148
225
}
149
226
150
227
define 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
+ ;
151
240
entry:
152
241
%cmp = fcmp une double %y , -0 .0
153
242
br i1 %cmp , label %return , label %else
@@ -159,52 +248,81 @@ else:
159
248
return:
160
249
%retval = phi double [ %div , %else ], [ %x , %entry ]
161
250
ret double %retval
162
-
163
- ; CHECK-LABEL: define double @fcmp_une_zero(
164
- ; CHECK: %div = fdiv double %x, %y
165
251
}
166
252
167
253
; We also cannot propagate a value if it's not a constant.
168
254
; This is because the value could be 0.0 or -0.0.
169
255
170
256
define 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
+ ;
171
270
entry:
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
175
274
176
275
if:
177
- %div = fdiv double %x , %z
178
- br label %return
276
+ %div = fdiv double %x , %z
277
+ br label %return
179
278
180
279
return:
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
186
282
}
187
283
188
284
define 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
+ ;
189
298
entry:
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
193
302
194
303
else:
195
- %div = fdiv double %x , %z
196
- br label %return
304
+ %div = fdiv double %x , %z
305
+ br label %return
197
306
198
307
return:
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
204
310
}
205
311
206
312
207
313
define 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
+ ;
208
326
entry:
209
327
%cmp = fcmp ueq double %y , 2 .0
210
328
br i1 %cmp , label %do_div , label %return
@@ -216,12 +334,21 @@ do_div:
216
334
return:
217
335
%retval = phi double [ %div , %do_div ], [ %x , %entry ]
218
336
ret double %retval
219
-
220
- ; CHECK-LABEL: define double @fcmp_ueq_possibly_nan(
221
- ; CHECK: %div = fdiv double %x, %y
222
337
}
223
338
224
339
define 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
+ ;
225
352
entry:
226
353
%cmp = fcmp nnan ueq double %y , 2 .0
227
354
br i1 %cmp , label %do_div , label %return
@@ -233,7 +360,4 @@ do_div:
233
360
return:
234
361
%retval = phi double [ %div , %do_div ], [ %x , %entry ]
235
362
ret double %retval
236
-
237
- ; CHECK-LABEL: define double @fcmp_ueq_not_zero_or_nan(
238
- ; CHECK: %div = fdiv double %x, 2.0
239
363
}
0 commit comments