Skip to content

Commit 1da9834

Browse files
committed
[JumpThreading] ProcessBranchOnXOR(): bailout if any pred ends in indirect branch (PR46857)
SplitBlockPredecessors() can not split blocks that have such terminators, and in two other places we already ensure that we don't end up calling SplitBlockPredecessors() on such blocks. Do so in one more place. Fixes https://bugs.llvm.org/show_bug.cgi?id=46857
1 parent 61480db commit 1da9834

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

llvm/lib/Transforms/Scalar/JumpThreading.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1859,6 +1859,14 @@ bool JumpThreadingPass::ProcessBranchOnXOR(BinaryOperator *BO) {
18591859
return true;
18601860
}
18611861

1862+
// If any of predecessors end with an indirect goto, we can't change its
1863+
// destination. Same for CallBr.
1864+
if (any_of(BlocksToFoldInto, [](BasicBlock *Pred) {
1865+
return isa<IndirectBrInst>(Pred->getTerminator()) ||
1866+
isa<CallBrInst>(Pred->getTerminator());
1867+
}))
1868+
return false;
1869+
18621870
// Try to duplicate BB into PredBB.
18631871
return DuplicateCondBranchOnPHIIntoPred(BB, BlocksToFoldInto);
18641872
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -jump-threading -S | FileCheck %s
3+
4+
; CHECK-ALL-LABEL: @func(
5+
6+
define i1 @func(i1 %arg, i32 %arg1, i1 %arg2) {
7+
; CHECK-LABEL: @func(
8+
; CHECK-NEXT: bb:
9+
; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]
10+
; CHECK: bb3:
11+
; CHECK-NEXT: [[I:%.*]] = icmp eq i32 [[ARG1:%.*]], 0
12+
; CHECK-NEXT: br label [[BB7:%.*]]
13+
; CHECK: bb4:
14+
; CHECK-NEXT: callbr void asm sideeffect "", "X"(i8* blockaddress(@func, [[BB7]]))
15+
; CHECK-NEXT: to label [[BB5:%.*]] [label %bb7]
16+
; CHECK: bb5:
17+
; CHECK-NEXT: br label [[BB7]]
18+
; CHECK: bb7:
19+
; CHECK-NEXT: [[I8:%.*]] = phi i1 [ [[I]], [[BB3]] ], [ [[ARG2:%.*]], [[BB5]] ], [ [[ARG2]], [[BB4]] ]
20+
; CHECK-NEXT: [[I9:%.*]] = xor i1 [[I8]], [[ARG]]
21+
; CHECK-NEXT: br i1 [[I9]], label [[BB11:%.*]], label [[BB11]]
22+
; CHECK: bb11:
23+
; CHECK-NEXT: ret i1 [[I9]]
24+
;
25+
bb:
26+
br i1 %arg, label %bb3, label %bb4
27+
28+
bb3:
29+
%i = icmp eq i32 %arg1, 0
30+
br label %bb7
31+
32+
bb4:
33+
callbr void asm sideeffect "", "X"(i8* blockaddress(@func, %bb6))
34+
to label %bb5 [label %bb6]
35+
36+
bb5:
37+
br label %bb6
38+
39+
bb6:
40+
br label %bb7
41+
42+
bb7:
43+
%i8 = phi i1 [ %i, %bb3 ], [ %arg2, %bb6 ]
44+
%i9 = xor i1 %i8, %arg
45+
br i1 %i9, label %bb11, label %bb10
46+
47+
bb10:
48+
br label %bb11
49+
50+
bb11:
51+
ret i1 %i9
52+
}

0 commit comments

Comments
 (0)