[llvm] r368873 - Ignore indirect branches from callbr.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 16 00:17:42 PDT 2019


Merged to release_90 in r369085.

On Wed, Aug 14, 2019 at 6:43 PM Bill Wendling via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: void
> Date: Wed Aug 14 09:44:07 2019
> New Revision: 368873
>
> URL: http://llvm.org/viewvc/llvm-project?rev=368873&view=rev
> Log:
> Ignore indirect branches from callbr.
>
> Summary:
> We can't speculate around indirect branches: indirectbr and invoke. The
> callbr instruction needs to be included here.
>
> Reviewers: nickdesaulniers, manojgupta, chandlerc
>
> Reviewed By: chandlerc
>
> Subscribers: llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D66200
>
> Added:
>     llvm/trunk/test/Transforms/SpeculateAroundPHIs/pr42991.ll
> Modified:
>     llvm/trunk/lib/Transforms/Scalar/SpeculateAroundPHIs.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SpeculateAroundPHIs.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SpeculateAroundPHIs.cpp?rev=368873&r1=368872&r2=368873&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SpeculateAroundPHIs.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SpeculateAroundPHIs.cpp Wed Aug 14 09:44:07 2019
> @@ -777,8 +777,10 @@ static bool tryToSpeculatePHIs(SmallVect
>      // speculation if the predecessor is an invoke. This doesn't seem
>      // fundamental and we should probably be splitting critical edges
>      // differently.
> -    if (isa<IndirectBrInst>(PredBB->getTerminator()) ||
> -        isa<InvokeInst>(PredBB->getTerminator())) {
> +    const auto *TermInst = PredBB->getTerminator();
> +    if (isa<IndirectBrInst>(TermInst) ||
> +        isa<InvokeInst>(TermInst) ||
> +        isa<CallBrInst>(TermInst)) {
>        LLVM_DEBUG(dbgs() << "  Invalid: predecessor terminator: "
>                          << PredBB->getName() << "\n");
>        return false;
>
> Added: llvm/trunk/test/Transforms/SpeculateAroundPHIs/pr42991.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SpeculateAroundPHIs/pr42991.ll?rev=368873&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/SpeculateAroundPHIs/pr42991.ll (added)
> +++ llvm/trunk/test/Transforms/SpeculateAroundPHIs/pr42991.ll Wed Aug 14 09:44:07 2019
> @@ -0,0 +1,44 @@
> +; RUN: opt -S -passes=spec-phis %s
> +
> +; This testcase crashes during the speculate around PHIs pass. The pass however
> +; results in no changes.
> +
> +define i32 @test1() {
> +entry:
> +  callbr void asm sideeffect "", "X,X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@test1, %return), i8* blockaddress(@test1, %f))
> +          to label %asm.fallthrough [label %return, label %f]
> +
> +asm.fallthrough:
> +  br label %return
> +
> +f:
> +  br label %return
> +
> +return:
> +  %retval.0 = phi i32 [ 0, %f ], [ 1, %asm.fallthrough ], [ 1, %entry ]
> +  ret i32 %retval.0
> +}
> +
> +define void @test2() {
> +entry:
> +  br label %tailrecurse
> +
> +tailrecurse:
> +  %call = tail call i32 @test3()
> +  %tobool1 = icmp eq i32 %call, 0
> +  callbr void asm sideeffect "", "X,X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@test2, %test1.exit), i8* blockaddress(@test2, %f.i))
> +          to label %if.end6 [label %test1.exit, label %f.i]
> +
> +f.i:
> +  br label %test1.exit
> +
> +test1.exit:
> +  %retval.0.i = phi i1 [ false, %f.i ], [ true, %tailrecurse ]
> +  %brmerge = or i1 %tobool1, %retval.0.i
> +  br i1 %brmerge, label %if.end6, label %tailrecurse
> +
> +if.end6:
> +  ret void
> +}
> +
> +declare i32 @test3()
>
>
> _______________________________________________
> 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