[PATCH] D29111: [SimplifyCFG] Do not sink and merge inline-asm instructions
Akira Hatanaka via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 24 22:33:13 PST 2017
This revision was automatically updated to reflect the committed changes.
ahatanak marked an inline comment as done.
Closed by commit rL293025: [SimplifyCFG] Do not sink and merge inline-asm instructions. (authored by ahatanak).
Changed prior to commit:
https://reviews.llvm.org/D29111?vs=85678&id=85697#toc
Repository:
rL LLVM
https://reviews.llvm.org/D29111
Files:
llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
Index: llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
===================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
+++ llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
@@ -768,6 +768,30 @@
; 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) {
Index: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -1436,6 +1436,14 @@
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())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29111.85697.patch
Type: text/x-patch
Size: 2008 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170125/5a0bcb4e/attachment.bin>
More information about the llvm-commits
mailing list