[llvm] r293025 - [SimplifyCFG] Do not sink and merge inline-asm instructions.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 25 09:26:46 PST 2017


Merged to 4.0 in r293074 as requested on the review thread.

On Tue, Jan 24, 2017 at 10:21 PM, Akira Hatanaka via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: ahatanak
> Date: Wed Jan 25 00:21:51 2017
> New Revision: 293025
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293025&view=rev
> Log:
> [SimplifyCFG] Do not sink and merge inline-asm instructions.
>
> Conservatively disable sinking and merging inline-asm instructions as doing so
> can potentially create arguments that cannot satisfy the inline-asm constraints.
>
> For example, SimplifyCFG used to do the following transformation:
>
> (before)
> if.then:
>   %0 = call i32 asm "rorl $2, $0", "=&r,0,n"(i32 %r6, i32 8)
>   br label %if.end
> if.else:
>   %1 = call i32 asm "rorl $2, $0", "=&r,0,n"(i32 %r6, i32 6)
>   br label %if.end
>
> (after)
>   %.sink = select i1 %tobool, i32 6, i32 8
>   %0 = call i32 asm "rorl $2, $0", "=&r,0,n"(i32 %r6, i32 %.sink)
>
> This would result in a crash in the backend since only immediate integer operands
> are permitted for constraint "n".
>
> rdar://problem/30110806
>
> Differential Revision: https://reviews.llvm.org/D29111
>
>
>
>
> Modified:
>     llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>     llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
>
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=293025&r1=293024&r2=293025&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Wed Jan 25 00:21:51 2017
> @@ -1436,6 +1436,14 @@ static bool canSinkInstructions(
>      if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) ||
>          I->getType()->isTokenTy())
>        return false;
> +
> +    // Conservatively return false if I is an inline-asm instruction. Sinking
> +    // and merging inline-asm instructions can potentially create arguments
> +    // that cannot satisfy the inline-asm constraints.
> +    if (const auto *C = dyn_cast<CallInst>(I))
> +      if (C->isInlineAsm())
> +        return false;
> +
>      // Everything must have only one use too, apart from stores which
>      // have no uses.
>      if (!isa<StoreInst>(I) && !I->hasOneUse())
>
> Modified: llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll?rev=293025&r1=293024&r2=293025&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll (original)
> +++ llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll Wed Jan 25 00:21:51 2017
> @@ -768,6 +768,30 @@ if.end:
>  ; CHECK-NOT: exact
>  ; CHECK: }
>
> +; Check that simplifycfg doesn't sink and merge inline-asm instructions.
> +
> +define i32 @test_inline_asm1(i32 %c, i32 %r6) {
> +entry:
> +  %tobool = icmp eq i32 %c, 0
> +  br i1 %tobool, label %if.else, label %if.then
> +
> +if.then:
> +  %0 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8)
> +  br label %if.end
> +
> +if.else:
> +  %1 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6)
> +  br label %if.end
> +
> +if.end:
> +  %r6.addr.0 = phi i32 [ %0, %if.then ], [ %1, %if.else ]
> +  ret i32 %r6.addr.0
> +}
> +
> +; CHECK-LABEL: @test_inline_asm1(
> +; CHECK: call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8)
> +; CHECK: call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6)
> +
>  declare i32 @call_target()
>
>  define void @test_operand_bundles(i1 %cond, i32* %ptr) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list