[llvm] 2fe4576 - Filter callbr insts from critical edge splitting

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 21 00:54:07 PST 2020


Pushed to 10.x in da0fe2ade369223ebea2dafd411746e854a801f2

On Fri, Feb 21, 2020 at 1:26 AM Bill Wendling via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Bill Wendling
> Date: 2020-02-20T16:24:42-08:00
> New Revision: 2fe457690da0fc38bc7f9f1d0aee2ba6a6a16ada
>
> URL: https://github.com/llvm/llvm-project/commit/2fe457690da0fc38bc7f9f1d0aee2ba6a6a16ada
> DIFF: https://github.com/llvm/llvm-project/commit/2fe457690da0fc38bc7f9f1d0aee2ba6a6a16ada.diff
>
> LOG: 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.
>
> Added:
>     llvm/test/Transforms/LICM/callbr-crash.ll
>
> Modified:
>     llvm/lib/Transforms/Scalar/LICM.cpp
>     llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
> index 6e5870c18441..15d40a50e60a 100644
> --- a/llvm/lib/Transforms/Scalar/LICM.cpp
> +++ b/llvm/lib/Transforms/Scalar/LICM.cpp
> @@ -1489,7 +1489,8 @@ static bool canSplitPredecessors(PHINode *PN, LoopSafetyInfo *SafetyInfo) {
>      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;
>
> diff  --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
> index 19b926d79049..4ae94cec3979 100644
> --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
> +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
> @@ -506,7 +506,8 @@ llvm::SplitAllCriticalEdges(Function &F,
>    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;
>
> diff  --git a/llvm/test/Transforms/LICM/callbr-crash.ll b/llvm/test/Transforms/LICM/callbr-crash.ll
> new file mode 100644
> index 000000000000..e5e7215d5b41
> --- /dev/null
> +++ b/llvm/test/Transforms/LICM/callbr-crash.ll
> @@ -0,0 +1,18 @@
> +; 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
> +}
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list