Skip to content

Commit 2fe4576

Browse files
committed
Filter callbr insts from critical edge splitting
Similarly to how splitting predecessors with an indirectbr isn't handled in the generic way, we also shouldn't split callbrs, for similar reasons.
1 parent d4ded05 commit 2fe4576

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

llvm/lib/Transforms/Scalar/LICM.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,8 @@ static bool canSplitPredecessors(PHINode *PN, LoopSafetyInfo *SafetyInfo) {
14891489
return false;
14901490
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
14911491
BasicBlock *BBPred = *PI;
1492-
if (isa<IndirectBrInst>(BBPred->getTerminator()))
1492+
if (isa<IndirectBrInst>(BBPred->getTerminator()) ||
1493+
isa<CallBrInst>(BBPred->getTerminator()))
14931494
return false;
14941495
}
14951496
return true;

llvm/lib/Transforms/Utils/BasicBlockUtils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,8 @@ llvm::SplitAllCriticalEdges(Function &F,
506506
unsigned NumBroken = 0;
507507
for (BasicBlock &BB : F) {
508508
Instruction *TI = BB.getTerminator();
509-
if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI))
509+
if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI) &&
510+
!isa<CallBrInst>(TI))
510511
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
511512
if (SplitCriticalEdge(TI, i, Options))
512513
++NumBroken;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
; RUN: opt -licm -disable-output < %s
2+
3+
define i32 @j() {
4+
entry:
5+
br label %for.cond
6+
7+
for.cond: ; preds = %cond.true.i, %entry
8+
callbr void asm sideeffect "", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@j, %for.end))
9+
to label %cond.true.i [label %for.end]
10+
11+
cond.true.i: ; preds = %for.cond
12+
%asmresult1.i.i = extractvalue { i8, i32 } zeroinitializer, 1
13+
br i1 undef, label %for.end, label %for.cond
14+
15+
for.end: ; preds = %cond.true.i, %for.cond
16+
%asmresult1.i.i2 = phi i32 [ %asmresult1.i.i, %cond.true.i ], [ undef, %for.cond ]
17+
ret i32 undef
18+
}

0 commit comments

Comments
 (0)