@@ -42,9 +42,10 @@ define i32 @f(i32 %c) {
42
42
; CHECK: switch.lookup:
43
43
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.f, i32 0, i32 [[SWITCH_TABLEIDX]]
44
44
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
45
- ; CHECK-NEXT: ret i32 [[SWITCH_LOAD ]]
45
+ ; CHECK-NEXT: br label [[RETURN ]]
46
46
; CHECK: return:
47
- ; CHECK-NEXT: ret i32 15
47
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 15, [[ENTRY:%.*]] ]
48
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
48
49
;
49
50
entry:
50
51
switch i32 %c , label %sw.default [
@@ -81,9 +82,10 @@ define i8 @char(i32 %c) {
81
82
; CHECK: switch.lookup:
82
83
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [9 x i8], [9 x i8]* @switch.table.char, i32 0, i32 [[SWITCH_TABLEIDX]]
83
84
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i8, i8* [[SWITCH_GEP]], align 1
84
- ; CHECK-NEXT: ret i8 [[SWITCH_LOAD ]]
85
+ ; CHECK-NEXT: br label [[RETURN ]]
85
86
; CHECK: return:
86
- ; CHECK-NEXT: ret i8 15
87
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i8 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 15, [[ENTRY:%.*]] ]
88
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
87
89
;
88
90
entry:
89
91
switch i32 %c , label %sw.default [
@@ -172,9 +174,10 @@ define i8* @foostring(i32 %x) {
172
174
; CHECK: switch.lookup:
173
175
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* @switch.table.foostring, i32 0, i32 [[X]]
174
176
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i8*, i8** [[SWITCH_GEP]], align 8
175
- ; CHECK-NEXT: ret i8* [[SWITCH_LOAD ]]
177
+ ; CHECK-NEXT: br label [[RETURN ]]
176
178
; CHECK: return:
177
- ; CHECK-NEXT: ret i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str4, i64 0, i64 0)
179
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i8* [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ getelementptr inbounds ([6 x i8], [6 x i8]* @.str4, i64 0, i64 0), [[ENTRY:%.*]] ]
180
+ ; CHECK-NEXT: ret i8* [[RETVAL_0]]
178
181
;
179
182
entry:
180
183
switch i32 %x , label %sw.default [
@@ -210,9 +213,13 @@ define i32 @earlyreturncrash(i32 %x) {
210
213
; CHECK: switch.lookup:
211
214
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i32], [4 x i32]* @switch.table.earlyreturncrash, i32 0, i32 [[X]]
212
215
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
213
- ; CHECK-NEXT: ret i32 [[SWITCH_LOAD]]
216
+ ; CHECK-NEXT: [[SWITCH_GEP1:%.*]] = getelementptr inbounds [4 x i32], [4 x i32]* @switch.table.earlyreturncrash.1, i32 0, i32 [[X]]
217
+ ; CHECK-NEXT: [[SWITCH_LOAD2:%.*]] = load i32, i32* [[SWITCH_GEP1]], align 4
218
+ ; CHECK-NEXT: br label [[SW_EPILOG]]
214
219
; CHECK: sw.epilog:
215
- ; CHECK-NEXT: ret i32 7
220
+ ; CHECK-NEXT: [[A_0:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 7, [[ENTRY:%.*]] ]
221
+ ; CHECK-NEXT: [[B_0:%.*]] = phi i32 [ [[SWITCH_LOAD2]], [[SWITCH_LOOKUP]] ], [ 10, [[ENTRY]] ]
222
+ ; CHECK-NEXT: ret i32 [[A_0]]
216
223
;
217
224
entry:
218
225
switch i32 %x , label %sw.default [
@@ -343,15 +350,12 @@ define i1 @undef(i32 %tmp) {
343
350
; CHECK-LABEL: @undef(
344
351
; CHECK-NEXT: bb:
345
352
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[TMP:%.*]], 9
346
- ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[BB3:%.*]]
347
- ; CHECK: switch.lookup:
348
353
; CHECK-NEXT: [[SWITCH_CAST:%.*]] = trunc i32 [[TMP]] to i9
349
354
; CHECK-NEXT: [[SWITCH_SHIFTAMT:%.*]] = mul i9 [[SWITCH_CAST]], 1
350
355
; CHECK-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i9 3, [[SWITCH_SHIFTAMT]]
351
356
; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = trunc i9 [[SWITCH_DOWNSHIFT]] to i1
352
- ; CHECK-NEXT: ret i1 [[SWITCH_MASKED]]
353
- ; CHECK: bb3:
354
- ; CHECK-NEXT: ret i1 undef
357
+ ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP0]], i1 [[SWITCH_MASKED]], i1 undef
358
+ ; CHECK-NEXT: ret i1 [[TMP4]]
355
359
;
356
360
bb:
357
361
switch i32 %tmp , label %bb3 [
@@ -384,9 +388,10 @@ define i32 @large(i32 %x) {
384
388
; CHECK: switch.lookup:
385
389
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [199 x i32], [199 x i32]* @switch.table.large, i32 0, i32 [[SWITCH_TABLEIDX]]
386
390
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
387
- ; CHECK-NEXT: ret i32 [[SWITCH_LOAD ]]
391
+ ; CHECK-NEXT: br label [[RETURN ]]
388
392
; CHECK: return:
389
- ; CHECK-NEXT: ret i32 0
393
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ]
394
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
390
395
;
391
396
entry:
392
397
%cmp = icmp slt i32 %x , 0
@@ -814,9 +819,10 @@ define i32 @cprop(i32 %x, i32 %y) {
814
819
; CHECK: switch.lookup:
815
820
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.cprop, i32 0, i32 [[SWITCH_TABLEIDX]]
816
821
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
817
- ; CHECK-NEXT: ret i32 [[SWITCH_LOAD ]]
822
+ ; CHECK-NEXT: br label [[RETURN ]]
818
823
; CHECK: return:
819
- ; CHECK-NEXT: ret i32 123
824
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 123, [[ENTRY:%.*]] ]
825
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
820
826
;
821
827
entry:
822
828
switch i32 %x , label %sw.default [
@@ -863,9 +869,10 @@ define i32 @unreachable_case(i32 %x) {
863
869
; CHECK: switch.lookup:
864
870
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [9 x i32], [9 x i32]* @switch.table.unreachable_case, i32 0, i32 [[X]]
865
871
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
866
- ; CHECK-NEXT: ret i32 [[SWITCH_LOAD ]]
872
+ ; CHECK-NEXT: br label [[RETURN ]]
867
873
; CHECK: return:
868
- ; CHECK-NEXT: ret i32 2
874
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 2, [[ENTRY:%.*]] ]
875
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
869
876
;
870
877
entry:
871
878
switch i32 %x , label %sw.default [
@@ -1080,9 +1087,10 @@ define i32 @threecases(i32 %c) {
1080
1087
; CHECK: switch.lookup:
1081
1088
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x i32], [3 x i32]* @switch.table.threecases, i32 0, i32 [[C]]
1082
1089
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]], align 4
1083
- ; CHECK-NEXT: ret i32 [[SWITCH_LOAD ]]
1090
+ ; CHECK-NEXT: br label [[RETURN ]]
1084
1091
; CHECK: return:
1085
- ; CHECK-NEXT: ret i32 3
1092
+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 3, [[ENTRY:%.*]] ]
1093
+ ; CHECK-NEXT: ret i32 [[X]]
1086
1094
;
1087
1095
entry:
1088
1096
switch i32 %c , label %sw.default [
@@ -1214,14 +1222,11 @@ define i8 @linearmap1(i32 %c) {
1214
1222
; CHECK-NEXT: entry:
1215
1223
; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[C:%.*]], 10
1216
1224
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 4
1217
- ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
1218
- ; CHECK: switch.lookup:
1219
1225
; CHECK-NEXT: [[SWITCH_IDX_CAST:%.*]] = trunc i32 [[SWITCH_TABLEIDX]] to i8
1220
1226
; CHECK-NEXT: [[SWITCH_IDX_MULT:%.*]] = mul i8 [[SWITCH_IDX_CAST]], -5
1221
1227
; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add i8 [[SWITCH_IDX_MULT]], 18
1222
- ; CHECK-NEXT: ret i8 [[SWITCH_OFFSET]]
1223
- ; CHECK: return:
1224
- ; CHECK-NEXT: ret i8 3
1228
+ ; CHECK-NEXT: [[X:%.*]] = select i1 [[TMP0]], i8 [[SWITCH_OFFSET]], i8 3
1229
+ ; CHECK-NEXT: ret i8 [[X]]
1225
1230
;
1226
1231
entry:
1227
1232
switch i32 %c , label %sw.default [
@@ -1245,13 +1250,10 @@ define i32 @linearmap2(i8 %c) {
1245
1250
; CHECK-NEXT: entry:
1246
1251
; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i8 [[C:%.*]], -13
1247
1252
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i8 [[SWITCH_TABLEIDX]], 4
1248
- ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
1249
- ; CHECK: switch.lookup:
1250
1253
; CHECK-NEXT: [[SWITCH_IDX_CAST:%.*]] = zext i8 [[SWITCH_TABLEIDX]] to i32
1251
1254
; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add i32 [[SWITCH_IDX_CAST]], 18
1252
- ; CHECK-NEXT: ret i32 [[SWITCH_OFFSET]]
1253
- ; CHECK: return:
1254
- ; CHECK-NEXT: ret i32 3
1255
+ ; CHECK-NEXT: [[X:%.*]] = select i1 [[TMP0]], i32 [[SWITCH_OFFSET]], i32 3
1256
+ ; CHECK-NEXT: ret i32 [[X]]
1255
1257
;
1256
1258
entry:
1257
1259
switch i8 %c , label %sw.default [
@@ -1275,13 +1277,10 @@ define i8 @linearmap3(i32 %c) {
1275
1277
; CHECK-NEXT: entry:
1276
1278
; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[C:%.*]], 10
1277
1279
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 4
1278
- ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
1279
- ; CHECK: switch.lookup:
1280
1280
; CHECK-NEXT: [[SWITCH_IDX_CAST:%.*]] = trunc i32 [[SWITCH_TABLEIDX]] to i8
1281
1281
; CHECK-NEXT: [[SWITCH_IDX_MULT:%.*]] = mul i8 [[SWITCH_IDX_CAST]], 100
1282
- ; CHECK-NEXT: ret i8 [[SWITCH_IDX_MULT]]
1283
- ; CHECK: return:
1284
- ; CHECK-NEXT: ret i8 3
1282
+ ; CHECK-NEXT: [[X:%.*]] = select i1 [[TMP0]], i8 [[SWITCH_IDX_MULT]], i8 3
1283
+ ; CHECK-NEXT: ret i8 [[X]]
1285
1284
;
1286
1285
entry:
1287
1286
switch i32 %c , label %sw.default [
@@ -1305,12 +1304,9 @@ define i8 @linearmap4(i32 %c) {
1305
1304
; CHECK-NEXT: entry:
1306
1305
; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[C:%.*]], -2
1307
1306
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 4
1308
- ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
1309
- ; CHECK: switch.lookup:
1310
1307
; CHECK-NEXT: [[SWITCH_IDX_CAST:%.*]] = trunc i32 [[SWITCH_TABLEIDX]] to i8
1311
- ; CHECK-NEXT: ret i8 [[SWITCH_IDX_CAST]]
1312
- ; CHECK: return:
1313
- ; CHECK-NEXT: ret i8 3
1308
+ ; CHECK-NEXT: [[X:%.*]] = select i1 [[TMP0]], i8 [[SWITCH_IDX_CAST]], i8 3
1309
+ ; CHECK-NEXT: ret i8 [[X]]
1314
1310
;
1315
1311
entry:
1316
1312
switch i32 %c , label %sw.default [
0 commit comments