return false;
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
BasicBlock *BBPred = *PI;
- if (isa<IndirectBrInst>(BBPred->getTerminator()))
+ if (isa<IndirectBrInst>(BBPred->getTerminator()) ||
+ isa<CallBrInst>(BBPred->getTerminator()))
return false;
}
return true;
unsigned NumBroken = 0;
for (BasicBlock &BB : F) {
Instruction *TI = BB.getTerminator();
- if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI))
+ if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI) &&
+ !isa<CallBrInst>(TI))
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
if (SplitCriticalEdge(TI, i, Options))
++NumBroken;
--- /dev/null
+; RUN: opt -licm -disable-output < %s
+
+define i32 @j() {
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %cond.true.i, %entry
+ callbr void asm sideeffect "", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@j, %for.end))
+ to label %cond.true.i [label %for.end]
+
+cond.true.i: ; preds = %for.cond
+ %asmresult1.i.i = extractvalue { i8, i32 } zeroinitializer, 1
+ br i1 undef, label %for.end, label %for.cond
+
+for.end: ; preds = %cond.true.i, %for.cond
+ %asmresult1.i.i2 = phi i32 [ %asmresult1.i.i, %cond.true.i ], [ undef, %for.cond ]
+ ret i32 undef
+}