[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