Skip to content

Commit 5730397

Browse files
committed
[JumpThreading] Thread over basicblocks with only an unconditional branch
1 parent 1283efc commit 5730397

File tree

5 files changed

+48
-44
lines changed

5 files changed

+48
-44
lines changed

llvm/lib/Transforms/Utils/Local.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -1013,12 +1013,14 @@ CanRedirectPredsOfEmptyBBToSucc(BasicBlock *BB, BasicBlock *Succ,
10131013
const SmallPtrSetImpl<BasicBlock *> &SuccPreds,
10141014
BasicBlock *&CommonPred) {
10151015

1016-
// There must be phis in BB, otherwise BB will be merged into Succ directly
1017-
if (BB->phis().empty() || Succ->phis().empty())
1016+
// Only handle the nontrivial case. Assume we need to update the phi of succ
1017+
// here.
1018+
if (Succ->phis().empty())
10181019
return false;
10191020

1020-
// BB must have predecessors not shared that can be redirected to Succ
1021-
if (!BB->hasNPredecessorsOrMore(2))
1021+
// BB must have multiple different uncommon predecessors that can be
1022+
// redirected to Succ
1023+
if (BB->getUniquePredecessor() || pred_empty(BB))
10221024
return false;
10231025

10241026
// Get single common predecessors of both BB and Succ

llvm/test/Transforms/JumpThreading/pr79175.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ define i32 @test(i64 %idx, i32 %val) {
1717
; CHECK: cond.end:
1818
; CHECK-NEXT: [[CMP_I:%.*]] = icmp sgt i32 [[VAL]], 0
1919
; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[CMP_I]]
20-
; CHECK-NEXT: br i1 [[COND_FR]], label [[COND_END_THREAD]], label [[TMP0:%.*]]
21-
; CHECK: cond.end.thread:
22-
; CHECK-NEXT: br label [[TMP0]]
20+
; CHECK-NEXT: br i1 [[COND_FR]], label [[TMP0:%.*]], label [[COND_END_THREAD]]
2321
; CHECK: 0:
24-
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 0, [[COND_END_THREAD]] ], [ [[VAL]], [[COND_END]] ]
22+
; CHECK-NEXT: br label [[COND_END_THREAD]]
23+
; CHECK: cond.end.thread:
24+
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[VAL]], [[COND_END]] ], [ 0, [[TMP0]] ], [ 0, [[FOR_BODY]] ]
2525
; CHECK-NEXT: [[F_IDX:%.*]] = getelementptr inbounds i32, ptr @f, i64 [[IDX]]
2626
; CHECK-NEXT: store i32 [[TMP1]], ptr [[F_IDX]], align 4
2727
; CHECK-NEXT: [[F_RELOAD:%.*]] = load i32, ptr @f, align 4

llvm/test/Transforms/JumpThreading/select.ll

+28-26
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/JumpThreading/thread-prob-7.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ define i32 @func0(i32 %a0, i32 %a1) !prof !0 {
1414
; CHECK-NEXT: br i1 [[CMP1]], label [[BB_JOIN_THREAD:%.*]], label [[TEST2_FALSE:%.*]], !prof [[PROF2:![0-9]+]]
1515
; CHECK: test2_false:
1616
; CHECK-NEXT: call void @foobar()
17-
; CHECK-NEXT: br label [[TMP0:%.*]]
17+
; CHECK-NEXT: br label [[BB_JOIN_THREAD]]
1818
; CHECK: bb_join:
1919
; CHECK-NEXT: [[C:%.*]] = phi i1 [ [[CX]], [[ENTRY:%.*]] ]
2020
; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[C]]
21-
; CHECK-NEXT: br i1 [[COND_FR]], label [[BB_JOIN_THREAD]], label [[TMP0]], !prof [[PROF3:![0-9]+]]
21+
; CHECK-NEXT: br i1 [[COND_FR]], label [[BB_JOIN_THREAD1:%.*]], label [[BB_JOIN_THREAD]], !prof [[PROF3:![0-9]+]]
2222
; CHECK: bb_join.thread:
23-
; CHECK-NEXT: br label [[TMP0]]
23+
; CHECK-NEXT: br label [[BB_JOIN_THREAD]]
2424
; CHECK: 0:
25-
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 42, [[BB_JOIN_THREAD]] ], [ 7, [[BB_JOIN]] ], [ 7, [[TEST2_FALSE]] ]
25+
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 7, [[BB_JOIN]] ], [ 7, [[TEST2_FALSE]] ], [ 42, [[TEST2]] ], [ 42, [[BB_JOIN_THREAD1]] ]
2626
; CHECK-NEXT: ret i32 [[TMP1]]
2727
;
2828
entry:

llvm/test/Transforms/JumpThreading/uncond-no-phi.ll

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ define i1 @if_else(i1 %c, i1 %c1) {
88
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[RETURN:%.*]]
99
; CHECK: then:
1010
; CHECK-NEXT: call void @dummy()
11-
; CHECK-NEXT: br i1 [[C1]], label [[RETURN]], label [[RETURN1:%.*]]
11+
; CHECK-NEXT: br i1 [[C1]], label [[ELSE:%.*]], label [[RETURN]]
1212
; CHECK: else:
13-
; CHECK-NEXT: br label [[RETURN1]]
13+
; CHECK-NEXT: br label [[RETURN]]
1414
; CHECK: return:
15-
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ true, [[RETURN]] ], [ false, [[THEN]] ]
15+
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ false, [[THEN]] ], [ true, [[ENTRY:%.*]] ], [ true, [[ELSE]] ]
1616
; CHECK-NEXT: ret i1 [[RETVAL_0]]
1717
;
1818
entry:
@@ -44,14 +44,14 @@ define i8 @switch_uncond(i8 %arg) {
4444
; CHECK-NEXT: unreachable
4545
; CHECK: bb:
4646
; CHECK-NEXT: call void @dummy()
47-
; CHECK-NEXT: br label [[BB2]]
47+
; CHECK-NEXT: br label [[END]]
4848
; CHECK: bb1:
4949
; CHECK-NEXT: call void @dummy()
50-
; CHECK-NEXT: br label [[BB2]]
50+
; CHECK-NEXT: br label [[END]]
5151
; CHECK: bb2:
5252
; CHECK-NEXT: br label [[END]]
5353
; CHECK: end:
54-
; CHECK-NEXT: [[PHI:%.*]] = phi i8 [ 0, [[BB2]] ], [ 1, [[ENTRY:%.*]] ]
54+
; CHECK-NEXT: [[PHI:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ 0, [[BB3]] ], [ 0, [[BB1]] ], [ 0, [[BB2]] ]
5555
; CHECK-NEXT: ret i8 [[PHI]]
5656
;
5757
entry:

0 commit comments

Comments
 (0)