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
22; Vary legal integer types in data layout.
33; RUN: opt < %s -passes=instcombine -S -data-layout=n32 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK32
44; RUN: opt < %s -passes=instcombine -S -data-layout=n32:64 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK64
55
66define 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:.*]]
1215; 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]]
1325;
1426entry:
1527 %and = and i64 %a , 4294967295
@@ -34,12 +46,24 @@ return:
3446}
3547
3648define 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:.*]]
4257; 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]]
4367;
4468entry:
4569 %or = or i64 %a , -4294967296
@@ -67,12 +91,24 @@ return:
6791; assertion.
6892
6993define 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:.*]]
75102; 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]]
76112;
77113entry:
78114 %and = and i72 %a , 295147905179352825855
@@ -103,15 +139,38 @@ return:
103139; because both are illegal.
104140
105141define 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:.*]]
110151; 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:.*]]
114167; 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
115174;
116175entry:
117176 %tmp0 = and i64 %a , 15
@@ -136,18 +195,19 @@ sw.default:
136195; https://llvm.org/bugs/show_bug.cgi?id=31260
137196
138197define 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:.*]]
145205; ALL-NEXT: ]
146- ; ALL: exit :
206+ ; ALL: [[EXIT]] :
147207; ALL-NEXT: ret i8 1
148- ; ALL: case126 :
208+ ; ALL: [[CASE126]] :
149209; ALL-NEXT: ret i8 3
150- ; ALL: case124 :
210+ ; ALL: [[CASE124]] :
151211; ALL-NEXT: ret i8 5
152212;
153213entry:
@@ -169,22 +229,43 @@ case124:
169229; Make sure the arithmetic evaluation of the switch
170230; condition is evaluated on the original type
171231define 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:.*]]
177243; 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]]
178259;
179260entry:
180261 %retval = alloca i32 , align 4
181262 %xor = xor i32 %a0 , 1034460917
182263 %shr = lshr i32 %xor , 16
183264 %add = add i32 %shr , -917677090
184265 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
188269 ]
189270
190271sw.bb: ; preds = %entry
@@ -219,11 +300,32 @@ declare i32 @goo()
219300; if original type is legal (i32 in this case)
220301
221302define 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:.*]]
226315; 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
227329;
228330 br label %1
229331
@@ -236,8 +338,8 @@ define void @PR29009() {
236338 %5 = call i32 @goo ()
237339 %6 = and i32 %5 , 7
238340 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
241343 ]
242344
243345; <label>:7: ; preds = %4
0 commit comments