Skip to content

Commit ca80824

Browse files
committed
[SimplifyCFG] Stop when Phi values are not redirected
1 parent d15bae3 commit ca80824

File tree

9 files changed

+93
-43
lines changed

9 files changed

+93
-43
lines changed

llvm/lib/Transforms/Utils/Local.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,14 +1081,16 @@ static bool introduceTooManyPhiEntries(BasicBlock *BB, BasicBlock *Succ) {
10811081
/// \param BBPreds The predecessors of BB.
10821082
/// \param PN The phi that we are updating.
10831083
/// \param CommonPred The common predecessor of BB and PN's BasicBlock
1084-
static void redirectValuesFromPredecessorsToPhi(BasicBlock *BB,
1084+
/// \return True if at least one Value has been redirected.
1085+
static bool redirectValuesFromPredecessorsToPhi(BasicBlock *BB,
10851086
const PredBlockVector &BBPreds,
10861087
PHINode *PN,
10871088
BasicBlock *CommonPred) {
10881089
Value *OldVal = PN->removeIncomingValue(BB, false);
10891090
assert(OldVal && "No entry in PHI for Pred BB!");
10901091

10911092
IncomingValueMap IncomingValues;
1093+
auto Changed = false;
10921094

10931095
// We are merging two blocks - BB, and the block containing PN - and
10941096
// as a result we need to redirect edges from the predecessors of BB
@@ -1123,6 +1125,7 @@ static void redirectValuesFromPredecessorsToPhi(BasicBlock *BB,
11231125
// And add a new incoming value for this predecessor for the
11241126
// newly retargeted branch.
11251127
PN->addIncoming(Selected, PredBB);
1128+
Changed = true;
11261129
}
11271130
if (CommonPred)
11281131
PN->addIncoming(OldValPN->getIncomingValueForBlock(CommonPred), BB);
@@ -1140,12 +1143,15 @@ static void redirectValuesFromPredecessorsToPhi(BasicBlock *BB,
11401143
// And add a new incoming value for this predecessor for the
11411144
// newly retargeted branch.
11421145
PN->addIncoming(Selected, PredBB);
1146+
Changed = true;
11431147
}
11441148
if (CommonPred)
11451149
PN->addIncoming(OldVal, BB);
11461150
}
11471151

11481152
replaceUndefValuesInPhi(PN, IncomingValues);
1153+
1154+
return Changed;
11491155
}
11501156

11511157
bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB,
@@ -1321,10 +1327,17 @@ bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB,
13211327
const PredBlockVector BBPreds(predecessors(BB));
13221328

13231329
// Loop over all of the PHI nodes in the successor of BB.
1330+
auto HasBeenRedirected = false;
13241331
for (BasicBlock::iterator I = Succ->begin(); isa<PHINode>(I); ++I) {
13251332
PHINode *PN = cast<PHINode>(I);
1326-
redirectValuesFromPredecessorsToPhi(BB, BBPreds, PN, CommonPred);
1333+
HasBeenRedirected |=
1334+
redirectValuesFromPredecessorsToPhi(BB, BBPreds, PN, CommonPred);
13271335
}
1336+
1337+
// If no value has been redirected from the predecessors then
1338+
// return false to avoid an infinity loop.
1339+
if (!HasBeenRedirected)
1340+
return false;
13281341
}
13291342

13301343
if (Succ->getSinglePredecessor()) {

llvm/test/Transforms/JumpThreading/select.ll

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ declare void @quux()
2121
; booleans where at least one operand is true/false/undef.
2222

2323
;.
24-
; CHECK: @[[ANCHOR:[a-zA-Z0-9_$"\\.-]+]] = constant [3 x ptr] [ptr blockaddress(@test_indirectbr, [[L1:%.*]]), ptr inttoptr (i32 1 to ptr), ptr blockaddress(@test_indirectbr, [[L3:%.*]])]
24+
; CHECK-BPI: @anchor = constant [3 x ptr] [ptr blockaddress(@test_indirectbr, %L1), ptr inttoptr (i32 1 to ptr), ptr blockaddress(@test_indirectbr, %L3)]
2525
;.
2626
define void @test_br(i1 %cond, i1 %value) nounwind {
2727
; CHECK-LABEL: @test_br(
@@ -66,8 +66,8 @@ define void @test_switch(i1 %cond, i8 %value) nounwind {
6666
; CHECK-NEXT: call void @quux()
6767
; CHECK-NEXT: [[EXPR:%.*]] = select i1 [[COND]], i8 1, i8 [[VALUE:%.*]]
6868
; CHECK-NEXT: switch i8 [[EXPR]], label [[L3:%.*]] [
69-
; CHECK-NEXT: i8 1, label [[L1]]
70-
; CHECK-NEXT: i8 2, label [[L2:%.*]]
69+
; CHECK-NEXT: i8 1, label [[L1]]
70+
; CHECK-NEXT: i8 2, label [[L2:%.*]]
7171
; CHECK-NEXT: ]
7272
; CHECK: L1:
7373
; CHECK-NEXT: call void @foo()
@@ -192,8 +192,8 @@ define void @test_switch_cmp(i1 %cond, i32 %val, i8 %value) nounwind {
192192
; CHECK: 0:
193193
; CHECK-NEXT: [[TMP1:%.*]] = phi i8 [ [[VALUE:%.*]], [[L0]] ]
194194
; CHECK-NEXT: switch i8 [[TMP1]], label [[L3:%.*]] [
195-
; CHECK-NEXT: i8 1, label [[L1]]
196-
; CHECK-NEXT: i8 2, label [[L2:%.*]]
195+
; CHECK-NEXT: i8 1, label [[L1]]
196+
; CHECK-NEXT: i8 2, label [[L2:%.*]]
197197
; CHECK-NEXT: ]
198198
; CHECK: L1:
199199
; CHECK-NEXT: call void @foo()
@@ -237,8 +237,8 @@ define void @test_switch_default(ptr nocapture %status) nounwind {
237237
; CHECK-NEXT: entry:
238238
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[STATUS:%.*]], align 4
239239
; CHECK-NEXT: switch i32 [[TMP0]], label [[L2:%.*]] [
240-
; CHECK-NEXT: i32 5061, label [[L2_THREAD:%.*]]
241-
; CHECK-NEXT: i32 0, label [[L2]]
240+
; CHECK-NEXT: i32 5061, label [[L2_THREAD:%.*]]
241+
; CHECK-NEXT: i32 0, label [[L2]]
242242
; CHECK-NEXT: ]
243243
; CHECK: L2.thread:
244244
; CHECK-NEXT: store i32 10025, ptr [[STATUS]], align 4
@@ -377,21 +377,21 @@ define i32 @unfold3(i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z, i32 %j) noun
377377
; CHECK-NEXT: br i1 [[CMP_I]], label [[DOTEXIT_THREAD4:%.*]], label [[COND_FALSE_I:%.*]]
378378
; CHECK: cond.false.i:
379379
; CHECK-NEXT: [[CMP4_I:%.*]] = icmp sgt i32 [[U]], [[V]]
380-
; CHECK-NEXT: br i1 [[CMP4_I]], label [[DOTEXIT_THREAD:%.*]], label [[COND_FALSE_6_I:%.*]]
380+
; CHECK-NEXT: br i1 [[CMP4_I]], label [[DOTEXIT_THREAD4]], label [[COND_FALSE_6_I:%.*]]
381381
; CHECK: cond.false.6.i:
382382
; CHECK-NEXT: [[CMP8_I:%.*]] = icmp slt i32 [[W:%.*]], [[X:%.*]]
383383
; CHECK-NEXT: br i1 [[CMP8_I]], label [[DOTEXIT_THREAD4]], label [[COND_FALSE_10_I:%.*]]
384384
; CHECK: cond.false.10.i:
385385
; CHECK-NEXT: [[CMP13_I:%.*]] = icmp sgt i32 [[W]], [[X]]
386-
; CHECK-NEXT: br i1 [[CMP13_I]], label [[DOTEXIT_THREAD]], label [[DOTEXIT:%.*]]
386+
; CHECK-NEXT: br i1 [[CMP13_I]], label [[DOTEXIT_THREAD4]], label [[DOTEXIT:%.*]]
387387
; CHECK: .exit:
388388
; CHECK-NEXT: [[PHITMP:%.*]] = icmp sge i32 [[Y:%.*]], [[Z:%.*]]
389389
; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[PHITMP]]
390-
; CHECK-NEXT: br i1 [[COND_FR]], label [[DOTEXIT_THREAD]], label [[DOTEXIT_THREAD4]]
391-
; CHECK: .exit.thread:
390+
; CHECK-NEXT: br i1 [[COND_FR]], label [[DOTEXIT_THREAD:%.*]], label [[DOTEXIT_THREAD4]]
391+
; CHECK: 0:
392392
; CHECK-NEXT: br label [[DOTEXIT_THREAD4]]
393-
; CHECK: .exit.thread4:
394-
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[J]], [[DOTEXIT_THREAD]] ], [ [[ADD3]], [[DOTEXIT]] ], [ [[ADD3]], [[ENTRY:%.*]] ], [ [[ADD3]], [[COND_FALSE_6_I]] ]
393+
; CHECK: .exit.thread:
394+
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[ADD3]], [[DOTEXIT]] ], [ [[J]], [[DOTEXIT_THREAD]] ], [ [[J]], [[COND_FALSE_I]] ], [ [[J]], [[COND_FALSE_10_I]] ], [ [[ADD3]], [[ENTRY:%.*]] ], [ [[ADD3]], [[COND_FALSE_6_I]] ]
395395
; CHECK-NEXT: ret i32 [[TMP0]]
396396
;
397397
entry:
@@ -430,23 +430,23 @@ define i32 @unfold4(i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z, i32 %j) noun
430430
; CHECK-NEXT: br i1 [[CMP_I]], label [[DOTEXIT_THREAD:%.*]], label [[COND_FALSE_I:%.*]]
431431
; CHECK: cond.false.i:
432432
; CHECK-NEXT: [[CMP4_I:%.*]] = icmp sgt i32 [[U]], [[V]]
433-
; CHECK-NEXT: br i1 [[CMP4_I]], label [[DOTEXIT_THREAD5:%.*]], label [[COND_FALSE_6_I:%.*]]
433+
; CHECK-NEXT: br i1 [[CMP4_I]], label [[DOTEXIT_THREAD]], label [[COND_FALSE_6_I:%.*]]
434434
; CHECK: cond.false.6.i:
435435
; CHECK-NEXT: [[CMP8_I:%.*]] = icmp slt i32 [[W:%.*]], [[X:%.*]]
436436
; CHECK-NEXT: br i1 [[CMP8_I]], label [[DOTEXIT_THREAD]], label [[COND_FALSE_10_I:%.*]]
437437
; CHECK: cond.false.10.i:
438438
; CHECK-NEXT: [[CMP13_I:%.*]] = icmp sgt i32 [[W]], [[X]]
439-
; CHECK-NEXT: br i1 [[CMP13_I]], label [[DOTEXIT_THREAD5]], label [[DOTEXIT:%.*]]
439+
; CHECK-NEXT: br i1 [[CMP13_I]], label [[DOTEXIT_THREAD]], label [[DOTEXIT:%.*]]
440440
; CHECK: .exit:
441441
; CHECK-NEXT: [[CMP19_I:%.*]] = icmp sge i32 [[Y:%.*]], [[Z:%.*]]
442442
; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP19_I]] to i32
443443
; CHECK-NEXT: [[LNOT_I18:%.*]] = icmp eq i32 [[CONV]], 1
444444
; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[LNOT_I18]]
445-
; CHECK-NEXT: br i1 [[COND_FR]], label [[DOTEXIT_THREAD]], label [[DOTEXIT_THREAD5]]
445+
; CHECK-NEXT: br i1 [[COND_FR]], label [[TMP1:%.*]], label [[DOTEXIT_THREAD]]
446+
; CHECK: 0:
447+
; CHECK-NEXT: br label [[DOTEXIT_THREAD]]
446448
; CHECK: .exit.thread:
447-
; CHECK-NEXT: br label [[DOTEXIT_THREAD5]]
448-
; CHECK: .exit.thread5:
449-
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[J]], [[DOTEXIT_THREAD]] ], [ [[ADD3]], [[DOTEXIT]] ], [ [[ADD3]], [[COND_FALSE_I]] ], [ [[ADD3]], [[COND_FALSE_10_I]] ]
449+
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[ADD3]], [[DOTEXIT]] ], [ [[J]], [[TMP1]] ], [ [[J]], [[ENTRY:%.*]] ], [ [[J]], [[COND_FALSE_6_I]] ], [ [[ADD3]], [[COND_FALSE_I]] ], [ [[ADD3]], [[COND_FALSE_10_I]] ]
450450
; CHECK-NEXT: ret i32 [[TMP0]]
451451
;
452452
entry:
@@ -560,10 +560,10 @@ define void @test_func(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr
560560
; CHECK: if.end:
561561
; CHECK-NEXT: [[LOCAL_VAR_0:%.*]] = phi i32 [ [[TMP1]], [[FOR_BODY]] ]
562562
; CHECK-NEXT: switch i32 [[LOCAL_VAR_0]], label [[SW_DEFAULT]] [
563-
; CHECK-NEXT: i32 2, label [[SW_BB]]
564-
; CHECK-NEXT: i32 4, label [[SW_BB7]]
565-
; CHECK-NEXT: i32 5, label [[SW_BB8:%.*]]
566-
; CHECK-NEXT: i32 7, label [[SW_BB9:%.*]]
563+
; CHECK-NEXT: i32 2, label [[SW_BB]]
564+
; CHECK-NEXT: i32 4, label [[SW_BB7]]
565+
; CHECK-NEXT: i32 5, label [[SW_BB8:%.*]]
566+
; CHECK-NEXT: i32 7, label [[SW_BB9:%.*]]
567567
; CHECK-NEXT: ]
568568
; CHECK: sw.bb:
569569
; CHECK-NEXT: call void @foo()
@@ -669,8 +669,10 @@ if.end:
669669
!0 = !{!"branch_weights", i64 1073741824, i64 3221225472}
670670
!1 = !{!"function_entry_count", i64 1984}
671671
;.
672-
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nounwind }
672+
; CHECK-BPI: attributes #[[ATTR0:[0-9]+]] = { nounwind }
673673
;.
674-
; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1984}
675-
; CHECK: [[PROF1]] = !{!"branch_weights", i64 1073741824, i64 3221225472}
674+
; CHECK-BPI: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1984}
675+
; CHECK-BPI: [[PROF1]] = !{!"branch_weights", i64 1073741824, i64 3221225472}
676676
;.
677+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
678+
; CHECK-BPI: {{.*}}

llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ define i32 @PR34471(i32 %x) {
146146
; NO_FWD: else3:
147147
; NO_FWD-NEXT: br label [[RETURN]]
148148
; NO_FWD: return:
149-
; NO_FWD-NEXT: [[R:%.*]] = phi i32 [ [[X]], [[IF19]] ], [ 0, [[ELSE3]] ], [ 17, [[ENTRY:%.*]] ]
149+
; NO_FWD-NEXT: [[R:%.*]] = phi i32 [ 0, [[ELSE3]] ], [ 17, [[ENTRY:%.*]] ], [ [[X]], [[IF19]] ]
150150
; NO_FWD-NEXT: ret i32 [[R]]
151151
;
152152
; FWD-LABEL: @PR34471(

llvm/test/Transforms/SimplifyCFG/HoistCode.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ define float @PR39535min_switch(i64 %i, float %x) {
7070
; CHECK: bb1:
7171
; CHECK-NEXT: br label [[END]]
7272
; CHECK: end:
73-
; CHECK-NEXT: [[COND:%.*]] = phi fast float [ [[X:%.*]], [[BB1]] ], [ 0.000000e+00, [[ENTRY:%.*]] ]
73+
; CHECK-NEXT: [[COND:%.*]] = phi fast float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[X:%.*]], [[BB1]] ]
7474
; CHECK-NEXT: ret float [[COND]]
7575
;
7676
entry:

llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ define i32 @overflow(i32 %type) {
330330
; CHECK: sw.default:
331331
; CHECK-NEXT: br label [[IF_END]]
332332
; CHECK: if.end:
333-
; CHECK-NEXT: [[DIRENT_TYPE_0:%.*]] = phi i32 [ 3, [[SW_DEFAULT]] ], [ 6, [[SW_BB3]] ], [ 5, [[SW_BB2]] ], [ 0, [[ENTRY:%.*]] ]
333+
; CHECK-NEXT: [[DIRENT_TYPE_0:%.*]] = phi i32 [ 3, [[SW_DEFAULT]] ], [ 5, [[SW_BB2]] ], [ 0, [[ENTRY:%.*]] ], [ 6, [[SW_BB3]] ]
334334
; CHECK-NEXT: ret i32 [[DIRENT_TYPE_0]]
335335
;
336336
entry:

llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table_big.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ define i32 @reachable_default_holes_0to32(i32 %x, i32 %y) {
434434
; CHECK: bb7:
435435
; CHECK-NEXT: br label [[RETURN]]
436436
; CHECK: return:
437-
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ 0, [[BB0]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ], [ 3, [[BB3]] ], [ 4, [[BB4]] ], [ 5, [[BB5]] ], [ 6, [[BB6]] ], [ 7, [[BB7]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ]
437+
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[Y:%.*]], [[ENTRY:%.*]] ], [ 0, [[BB0]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ], [ 3, [[BB3]] ], [ 4, [[BB4]] ], [ 5, [[BB5]] ], [ 6, [[BB6]] ], [ 7, [[BB7]] ]
438438
; CHECK-NEXT: ret i32 [[RES]]
439439
;
440440
entry:

llvm/test/Transforms/SimplifyCFG/pr142582.ll

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,40 @@ end:
3030
}
3131

3232
declare i1 @get_b()
33+
34+
define void @func_143(i32 %0, ptr %g_329) {
35+
; CHECK-LABEL: define void @func_143(
36+
; CHECK-SAME: i32 [[TMP0:%.*]], ptr [[G_329:%.*]]) {
37+
; CHECK-NEXT: [[ENTRY:.*]]:
38+
; CHECK-NEXT: switch i32 [[TMP0]], label %[[COMMON_RET:.*]] [
39+
; CHECK-NEXT: i32 0, label %[[FOR_INC295:.*]]
40+
; CHECK-NEXT: i32 1, label %[[FOR_END297:.*]]
41+
; CHECK-NEXT: i32 33, label %[[FOR_INC295]]
42+
; CHECK-NEXT: ]
43+
; CHECK: [[FOR_INC295]]:
44+
; CHECK-NEXT: br label %[[FOR_END297]]
45+
; CHECK: [[COMMON_RET]]:
46+
; CHECK-NEXT: ret void
47+
; CHECK: [[FOR_END297]]:
48+
; CHECK-NEXT: [[STOREMERGE739_LCSSA761:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ 1, %[[FOR_INC295]] ]
49+
; CHECK-NEXT: store i8 0, ptr [[G_329]], align 1
50+
; CHECK-NEXT: br label %[[COMMON_RET]]
51+
;
52+
entry:
53+
switch i32 %0, label %common.ret [
54+
i32 0, label %for.inc295
55+
i32 1, label %for.end297
56+
i32 33, label %for.inc295
57+
]
58+
59+
for.inc295: ; preds = %entry, %entry
60+
br label %for.end297
61+
62+
common.ret: ; preds = %for.end297, %entry
63+
ret void
64+
65+
for.end297: ; preds = %for.inc295, %entry
66+
%storemerge739.lcssa761 = phi i64 [ 0, %entry ], [ 1, %for.inc295 ]
67+
store i8 0, ptr %g_329, align 1
68+
br label %common.ret
69+
}

llvm/test/Transforms/SimplifyCFG/rangereduce.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ define i128 @test2(i128 %a) {
4646
; CHECK-NEXT: i128 109, label [[THREE]]
4747
; CHECK-NEXT: ]
4848
; CHECK: common.ret:
49-
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i128 [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ], [ 8867, [[TMP0:%.*]] ]
49+
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i128 [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 8867, [[TMP0:%.*]] ], [ 99783, [[THREE]] ]
5050
; CHECK-NEXT: ret i128 [[COMMON_RET_OP]]
5151
; CHECK: one:
5252
; CHECK-NEXT: br label [[COMMON_RET]]
@@ -114,7 +114,7 @@ define i32 @test4(i32 %a) {
114114
; CHECK-NEXT: i32 109, label [[THREE]]
115115
; CHECK-NEXT: ]
116116
; CHECK: common.ret:
117-
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ], [ 8867, [[TMP0:%.*]] ]
117+
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 8867, [[TMP0:%.*]] ], [ 99783, [[THREE]] ]
118118
; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]
119119
; CHECK: one:
120120
; CHECK-NEXT: br label [[COMMON_RET]]
@@ -151,7 +151,7 @@ define i32 @test5(i32 %a) {
151151
; CHECK-NEXT: i32 112, label [[THREE]]
152152
; CHECK-NEXT: ]
153153
; CHECK: common.ret:
154-
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ], [ 8867, [[TMP0:%.*]] ]
154+
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 8867, [[TMP0:%.*]] ], [ 99783, [[THREE]] ]
155155
; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]
156156
; CHECK: one:
157157
; CHECK-NEXT: br label [[COMMON_RET]]

llvm/test/Transforms/SimplifyCFG/switch-dup-bbs.ll

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,16 @@ define i32 @switch_some_duplicate_arms(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
7070
define i32 @switch_duplicate_arms_multipred(i1 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
7171
; SIMPLIFY-CFG-LABEL: define i32 @switch_duplicate_arms_multipred(
7272
; SIMPLIFY-CFG-SAME: i1 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]]) {
73-
; SIMPLIFY-CFG-NEXT: br i1 [[TMP0]], label %[[BB6:.*]], label %[[BB7:.*]]
73+
; SIMPLIFY-CFG-NEXT: br i1 [[TMP0]], label %[[BB6:.*]], label %[[BB8:.*]]
7474
; SIMPLIFY-CFG: [[BB6]]:
75-
; SIMPLIFY-CFG-NEXT: switch i32 [[TMP2]], label %[[BB9:.*]] [
76-
; SIMPLIFY-CFG-NEXT: i32 0, label %[[BB7]]
77-
; SIMPLIFY-CFG-NEXT: i32 1, label %[[BB8:.*]]
75+
; SIMPLIFY-CFG-NEXT: switch i32 [[TMP2]], label %[[BB8]] [
76+
; SIMPLIFY-CFG-NEXT: i32 0, label %[[BB7:.*]]
77+
; SIMPLIFY-CFG-NEXT: i32 1, label %[[BB7]]
7878
; SIMPLIFY-CFG-NEXT: ]
7979
; SIMPLIFY-CFG: [[BB7]]:
80-
; SIMPLIFY-CFG-NEXT: br label %[[BB9]]
80+
; SIMPLIFY-CFG-NEXT: br label %[[BB8]]
8181
; SIMPLIFY-CFG: [[BB8]]:
82-
; SIMPLIFY-CFG-NEXT: br label %[[BB9]]
83-
; SIMPLIFY-CFG: [[BB9]]:
84-
; SIMPLIFY-CFG-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP4]], %[[BB6]] ], [ [[TMP3]], %[[BB8]] ], [ [[TMP3]], %[[BB7]] ]
82+
; SIMPLIFY-CFG-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP4]], %[[BB6]] ], [ [[TMP3]], [[TMP5:%.*]] ], [ [[TMP3]], %[[BB7]] ]
8583
; SIMPLIFY-CFG-NEXT: ret i32 [[TMP10]]
8684
;
8785
br i1 %0, label %6, label %7

0 commit comments

Comments
 (0)