1
- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --prefix-filecheck-ir-name _ --version 5
2
2
; Vary legal integer types in data layout.
3
3
; RUN: opt < %s -passes=instcombine -S -data-layout=n32 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK32
4
4
; RUN: opt < %s -passes=instcombine -S -data-layout=n32:64 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK64
5
5
6
6
define i32 @positive1 (i64 %a ) {
7
- ; ALL-LABEL: @positive1(
8
- ; ALL: switch i32
9
- ; ALL-NEXT: i32 10, label %return
10
- ; ALL-NEXT: i32 100, label %sw.bb1
11
- ; ALL-NEXT: i32 1001, label %sw.bb2
7
+ ; ALL-LABEL: define i32 @positive1(
8
+ ; ALL-SAME: i64 [[A:%.*]]) {
9
+ ; ALL-NEXT: [[ENTRY:.*]]:
10
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i64 [[A]] to i32
11
+ ; ALL-NEXT: switch i32 [[TRUNC]], label %[[SW_DEFAULT:.*]] [
12
+ ; ALL-NEXT: i32 10, label %[[RETURN:.*]]
13
+ ; ALL-NEXT: i32 100, label %[[SW_BB1:.*]]
14
+ ; ALL-NEXT: i32 1001, label %[[SW_BB2:.*]]
12
15
; ALL-NEXT: ]
16
+ ; ALL: [[SW_BB1]]:
17
+ ; ALL-NEXT: br label %[[RETURN]]
18
+ ; ALL: [[SW_BB2]]:
19
+ ; ALL-NEXT: br label %[[RETURN]]
20
+ ; ALL: [[SW_DEFAULT]]:
21
+ ; ALL-NEXT: br label %[[RETURN]]
22
+ ; ALL: [[RETURN]]:
23
+ ; ALL-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 24, %[[SW_DEFAULT]] ], [ 123, %[[SW_BB2]] ], [ 213, %[[SW_BB1]] ], [ 231, %[[ENTRY]] ]
24
+ ; ALL-NEXT: ret i32 [[RETVAL_0]]
13
25
;
14
26
entry:
15
27
%and = and i64 %a , 4294967295
@@ -34,12 +46,24 @@ return:
34
46
}
35
47
36
48
define i32 @negative1 (i64 %a ) {
37
- ; ALL-LABEL: @negative1(
38
- ; ALL: switch i32
39
- ; ALL-NEXT: i32 -10, label %return
40
- ; ALL-NEXT: i32 -100, label %sw.bb1
41
- ; ALL-NEXT: i32 -1001, label %sw.bb2
49
+ ; ALL-LABEL: define i32 @negative1(
50
+ ; ALL-SAME: i64 [[A:%.*]]) {
51
+ ; ALL-NEXT: [[ENTRY:.*]]:
52
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i64 [[A]] to i32
53
+ ; ALL-NEXT: switch i32 [[TRUNC]], label %[[SW_DEFAULT:.*]] [
54
+ ; ALL-NEXT: i32 -10, label %[[RETURN:.*]]
55
+ ; ALL-NEXT: i32 -100, label %[[SW_BB1:.*]]
56
+ ; ALL-NEXT: i32 -1001, label %[[SW_BB2:.*]]
42
57
; ALL-NEXT: ]
58
+ ; ALL: [[SW_BB1]]:
59
+ ; ALL-NEXT: br label %[[RETURN]]
60
+ ; ALL: [[SW_BB2]]:
61
+ ; ALL-NEXT: br label %[[RETURN]]
62
+ ; ALL: [[SW_DEFAULT]]:
63
+ ; ALL-NEXT: br label %[[RETURN]]
64
+ ; ALL: [[RETURN]]:
65
+ ; ALL-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 24, %[[SW_DEFAULT]] ], [ 123, %[[SW_BB2]] ], [ 213, %[[SW_BB1]] ], [ 231, %[[ENTRY]] ]
66
+ ; ALL-NEXT: ret i32 [[RETVAL_0]]
43
67
;
44
68
entry:
45
69
%or = or i64 %a , -4294967296
@@ -67,12 +91,24 @@ return:
67
91
; assertion.
68
92
69
93
define i32 @trunc72to68 (i72 %a ) {
70
- ; ALL-LABEL: @trunc72to68(
71
- ; ALL: switch i68
72
- ; ALL-NEXT: i68 10, label %return
73
- ; ALL-NEXT: i68 100, label %sw.bb1
74
- ; ALL-NEXT: i68 1001, label %sw.bb2
94
+ ; ALL-LABEL: define i32 @trunc72to68(
95
+ ; ALL-SAME: i72 [[A:%.*]]) {
96
+ ; ALL-NEXT: [[ENTRY:.*]]:
97
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i72 [[A]] to i68
98
+ ; ALL-NEXT: switch i68 [[TRUNC]], label %[[SW_DEFAULT:.*]] [
99
+ ; ALL-NEXT: i68 10, label %[[RETURN:.*]]
100
+ ; ALL-NEXT: i68 100, label %[[SW_BB1:.*]]
101
+ ; ALL-NEXT: i68 1001, label %[[SW_BB2:.*]]
75
102
; ALL-NEXT: ]
103
+ ; ALL: [[SW_BB1]]:
104
+ ; ALL-NEXT: br label %[[RETURN]]
105
+ ; ALL: [[SW_BB2]]:
106
+ ; ALL-NEXT: br label %[[RETURN]]
107
+ ; ALL: [[SW_DEFAULT]]:
108
+ ; ALL-NEXT: br label %[[RETURN]]
109
+ ; ALL: [[RETURN]]:
110
+ ; ALL-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 24, %[[SW_DEFAULT]] ], [ 123, %[[SW_BB2]] ], [ 213, %[[SW_BB1]] ], [ 231, %[[ENTRY]] ]
111
+ ; ALL-NEXT: ret i32 [[RETVAL_0]]
76
112
;
77
113
entry:
78
114
%and = and i72 %a , 295147905179352825855
@@ -103,15 +139,38 @@ return:
103
139
; because both are illegal.
104
140
105
141
define void @trunc64to58 (i64 %a ) {
106
- ; ALL-LABEL: @trunc64to58(
107
- ; CHECK32: switch i58
108
- ; CHECK32-NEXT: i58 0, label %sw.bb1
109
- ; CHECK32-NEXT: i58 18717182647723699, label %sw.bb2
142
+ ; CHECK32-LABEL: define void @trunc64to58(
143
+ ; CHECK32-SAME: i64 [[A:%.*]]) {
144
+ ; CHECK32-NEXT: [[ENTRY:.*:]]
145
+ ; CHECK32-NEXT: [[TMP0:%.*]] = trunc i64 [[A]] to i58
146
+ ; CHECK32-NEXT: [[TMP1:%.*]] = and i58 [[TMP0]], 15
147
+ ; CHECK32-NEXT: [[TRUNC:%.*]] = mul nuw i58 [[TMP1]], 18717182647723699
148
+ ; CHECK32-NEXT: switch i58 [[TRUNC]], label %[[SW_DEFAULT:.*]] [
149
+ ; CHECK32-NEXT: i58 0, label %[[SW_BB1:.*]]
150
+ ; CHECK32-NEXT: i58 18717182647723699, label %[[SW_BB2:.*]]
110
151
; CHECK32-NEXT: ]
111
- ; CHECK64: switch i64
112
- ; CHECK64-NEXT: i64 0, label %sw.bb1
113
- ; CHECK64-NEXT: i64 18717182647723699, label %sw.bb2
152
+ ; CHECK32: [[SW_BB1]]:
153
+ ; CHECK32-NEXT: br label %[[SW_DEFAULT]]
154
+ ; CHECK32: [[SW_BB2]]:
155
+ ; CHECK32-NEXT: br label %[[SW_DEFAULT]]
156
+ ; CHECK32: [[SW_DEFAULT]]:
157
+ ; CHECK32-NEXT: ret void
158
+ ;
159
+ ; CHECK64-LABEL: define void @trunc64to58(
160
+ ; CHECK64-SAME: i64 [[A:%.*]]) {
161
+ ; CHECK64-NEXT: [[ENTRY:.*:]]
162
+ ; CHECK64-NEXT: [[_TMP0:%.*]] = and i64 [[A]], 15
163
+ ; CHECK64-NEXT: [[TMP0:%.*]] = mul nuw nsw i64 [[_TMP0]], 18717182647723699
164
+ ; CHECK64-NEXT: switch i64 [[TMP0]], label %[[SW_DEFAULT:.*]] [
165
+ ; CHECK64-NEXT: i64 0, label %[[SW_BB1:.*]]
166
+ ; CHECK64-NEXT: i64 18717182647723699, label %[[SW_BB2:.*]]
114
167
; CHECK64-NEXT: ]
168
+ ; CHECK64: [[SW_BB1]]:
169
+ ; CHECK64-NEXT: br label %[[SW_DEFAULT]]
170
+ ; CHECK64: [[SW_BB2]]:
171
+ ; CHECK64-NEXT: br label %[[SW_DEFAULT]]
172
+ ; CHECK64: [[SW_DEFAULT]]:
173
+ ; CHECK64-NEXT: ret void
115
174
;
116
175
entry:
117
176
%tmp0 = and i64 %a , 15
@@ -136,18 +195,19 @@ sw.default:
136
195
; https://llvm.org/bugs/show_bug.cgi?id=31260
137
196
138
197
define i8 @PR31260 (i8 %x ) {
139
- ; ALL-LABEL: @PR31260(
140
- ; ALL-NEXT: entry:
141
- ; ALL-NEXT: [[T4:%.*]] = and i8 [[X:%.*]], 2
142
- ; ALL-NEXT: switch i8 [[T4]], label [[EXIT:%.*]] [
143
- ; ALL-NEXT: i8 0, label [[CASE126:%.*]]
144
- ; ALL-NEXT: i8 2, label [[CASE124:%.*]]
198
+ ; ALL-LABEL: define i8 @PR31260(
199
+ ; ALL-SAME: i8 [[X:%.*]]) {
200
+ ; ALL-NEXT: [[ENTRY:.*:]]
201
+ ; ALL-NEXT: [[T4:%.*]] = and i8 [[X]], 2
202
+ ; ALL-NEXT: switch i8 [[T4]], label %[[EXIT:.*]] [
203
+ ; ALL-NEXT: i8 0, label %[[CASE126:.*]]
204
+ ; ALL-NEXT: i8 2, label %[[CASE124:.*]]
145
205
; ALL-NEXT: ]
146
- ; ALL: exit :
206
+ ; ALL: [[EXIT]] :
147
207
; ALL-NEXT: ret i8 1
148
- ; ALL: case126 :
208
+ ; ALL: [[CASE126]] :
149
209
; ALL-NEXT: ret i8 3
150
- ; ALL: case124 :
210
+ ; ALL: [[CASE124]] :
151
211
; ALL-NEXT: ret i8 5
152
212
;
153
213
entry:
@@ -169,22 +229,43 @@ case124:
169
229
; Make sure the arithmetic evaluation of the switch
170
230
; condition is evaluated on the original type
171
231
define i32 @trunc32to16 (i32 %a0 ) #0 {
172
- ; ALL-LABEL: @trunc32to16(
173
- ; ALL: switch i16
174
- ; ALL-NEXT: i16 63, label %sw.bb
175
- ; ALL-NEXT: i16 1, label %sw.bb1
176
- ; ALL-NEXT: i16 100, label %sw.bb2
232
+ ; ALL-LABEL: define i32 @trunc32to16(
233
+ ; ALL-SAME: i32 [[A0:%.*]]) {
234
+ ; ALL-NEXT: [[ENTRY:.*:]]
235
+ ; ALL-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
236
+ ; ALL-NEXT: [[XOR:%.*]] = lshr i32 [[A0]], 16
237
+ ; ALL-NEXT: [[TMP0:%.*]] = trunc nuw i32 [[XOR]] to i16
238
+ ; ALL-NEXT: [[TRUNC:%.*]] = xor i16 [[TMP0]], 15784
239
+ ; ALL-NEXT: switch i16 [[TRUNC]], label %[[SW_EPILOG:.*]] [
240
+ ; ALL-NEXT: i16 63, label %[[SW_BB:.*]]
241
+ ; ALL-NEXT: i16 1, label %[[SW_BB1:.*]]
242
+ ; ALL-NEXT: i16 100, label %[[SW_BB2:.*]]
177
243
; ALL-NEXT: ]
244
+ ; ALL: [[SW_BB]]:
245
+ ; ALL-NEXT: store i32 90, ptr [[RETVAL]], align 4
246
+ ; ALL-NEXT: br label %[[RETURN:.*]]
247
+ ; ALL: [[SW_BB1]]:
248
+ ; ALL-NEXT: store i32 91, ptr [[RETVAL]], align 4
249
+ ; ALL-NEXT: br label %[[RETURN]]
250
+ ; ALL: [[SW_BB2]]:
251
+ ; ALL-NEXT: store i32 92, ptr [[RETVAL]], align 4
252
+ ; ALL-NEXT: br label %[[RETURN]]
253
+ ; ALL: [[SW_EPILOG]]:
254
+ ; ALL-NEXT: store i32 113, ptr [[RETVAL]], align 4
255
+ ; ALL-NEXT: br label %[[RETURN]]
256
+ ; ALL: [[RETURN]]:
257
+ ; ALL-NEXT: [[RVAL:%.*]] = load i32, ptr [[RETVAL]], align 4
258
+ ; ALL-NEXT: ret i32 [[RVAL]]
178
259
;
179
260
entry:
180
261
%retval = alloca i32 , align 4
181
262
%xor = xor i32 %a0 , 1034460917
182
263
%shr = lshr i32 %xor , 16
183
264
%add = add i32 %shr , -917677090
184
265
switch i32 %add , label %sw.epilog [
185
- i32 -917677027 , label %sw.bb
186
- i32 -917677089 , label %sw.bb1
187
- i32 -917676990 , label %sw.bb2
266
+ i32 -917677027 , label %sw.bb
267
+ i32 -917677089 , label %sw.bb1
268
+ i32 -917676990 , label %sw.bb2
188
269
]
189
270
190
271
sw.bb: ; preds = %entry
@@ -219,11 +300,32 @@ declare i32 @goo()
219
300
; if original type is legal (i32 in this case)
220
301
221
302
define void @PR29009 () {
222
- ; ALL-LABEL: @PR29009(
223
- ; ALL: switch i32
224
- ; ALL-NEXT: i32 0, label
225
- ; ALL-NEXT: i32 3, label
303
+ ; ALL-LABEL: define void @PR29009() {
304
+ ; ALL-NEXT: br label %[[BB1:.*]]
305
+ ; ALL: [[BB1]]:
306
+ ; ALL-NEXT: [[TMP2:%.*]] = load volatile i32, ptr @njob, align 4
307
+ ; ALL-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP2]], 0
308
+ ; ALL-NEXT: br i1 [[DOTNOT]], label %[[BB10:.*]], label %[[BB3:.*]]
309
+ ; ALL: [[BB3]]:
310
+ ; ALL-NEXT: [[TMP4:%.*]] = call i32 @goo()
311
+ ; ALL-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 7
312
+ ; ALL-NEXT: switch i32 [[TMP5]], label %[[BB6:.*]] [
313
+ ; ALL-NEXT: i32 0, label %[[BB7:.*]]
314
+ ; ALL-NEXT: i32 3, label %[[BB8:.*]]
226
315
; ALL-NEXT: ]
316
+ ; ALL: [[BB6]]:
317
+ ; ALL-NEXT: store i32 6, ptr @a, align 4
318
+ ; ALL-NEXT: br label %[[BB9:.*]]
319
+ ; ALL: [[BB7]]:
320
+ ; ALL-NEXT: store i32 1, ptr @a, align 4
321
+ ; ALL-NEXT: br label %[[BB9]]
322
+ ; ALL: [[BB8]]:
323
+ ; ALL-NEXT: store i32 2, ptr @a, align 4
324
+ ; ALL-NEXT: br label %[[BB9]]
325
+ ; ALL: [[BB9]]:
326
+ ; ALL-NEXT: br label %[[BB1]]
327
+ ; ALL: [[BB10]]:
328
+ ; ALL-NEXT: ret void
227
329
;
228
330
br label %1
229
331
@@ -236,8 +338,8 @@ define void @PR29009() {
236
338
%5 = call i32 @goo ()
237
339
%6 = and i32 %5 , 7
238
340
switch i32 %6 , label %7 [
239
- i32 0 , label %8
240
- i32 3 , label %9
341
+ i32 0 , label %8
342
+ i32 3 , label %9
241
343
]
242
344
243
345
; <label>:7: ; preds = %4
0 commit comments