[llvm] r193808 - Do not convert "call asm" to "invoke asm" in Inliner.

Manman Ren manman.ren at gmail.com
Thu Oct 31 14:56:04 PDT 2013


Author: mren
Date: Thu Oct 31 16:56:03 2013
New Revision: 193808

URL: http://llvm.org/viewvc/llvm-project?rev=193808&view=rev
Log:
Do not convert "call asm" to "invoke asm" in Inliner.

Given that backend does not handle "invoke asm" correctly ("invoke asm" will be
handled by SelectionDAGBuilder::visitInlineAsm, which does not have the right
setup for LPadToCallSiteMap) and we already made the assumption that inline asm
does not throw in InstCombiner::visitCallSite, we are going to make the same
assumption in Inliner to make sure we don't convert "call asm" to "invoke asm".

If it becomes necessary to add support for "invoke asm" later on, we will need
to modify the backend as well as remove the assumptions that inline asm does
not throw.

Fix rdar://15317907

Added:
    llvm/trunk/test/Transforms/Inline/inline_invoke_with_asm_call.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp

Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=193808&r1=193807&r2=193808&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Thu Oct 31 16:56:03 2013
@@ -193,7 +193,8 @@ static bool HandleCallsInBlockInlinedThr
     CallInst *CI = dyn_cast<CallInst>(I);
 
     // If this call cannot unwind, don't convert it to an invoke.
-    if (!CI || CI->doesNotThrow())
+    // Inline asm calls cannot throw.
+    if (!CI || CI->doesNotThrow() || isa<InlineAsm>(CI->getCalledValue()))
       continue;
 
     // Convert this function call into an invoke instruction.  First, split the

Added: llvm/trunk/test/Transforms/Inline/inline_invoke_with_asm_call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/inline_invoke_with_asm_call.ll?rev=193808&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/Inline/inline_invoke_with_asm_call.ll (added)
+++ llvm/trunk/test/Transforms/Inline/inline_invoke_with_asm_call.ll Thu Oct 31 16:56:03 2013
@@ -0,0 +1,30 @@
+; RUN: opt < %s -inline -S | FileCheck %s
+target triple = "x86_64-apple-darwin"
+
+; rdar://15317907
+; CHECK-LABEL: @caller
+; Make sure we are generating "call asm" instead of "invoke asm".
+; CHECK: call void asm
+; CHECK-LABEL: @callee_with_asm
+define void @caller() {
+  br i1 undef, label %1, label %4
+
+; <label>:1
+  invoke void @callee_with_asm()
+          to label %4 unwind label %2
+
+; <label>:2
+  %3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*)
+          cleanup
+  resume { i8*, i32 } undef
+
+; <label>:4
+  ret void
+}
+
+define void @callee_with_asm() {
+  call void asm sideeffect "mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue", ""()
+  ret void
+}
+
+declare i32 @__objc_personality_v0(...)





More information about the llvm-commits mailing list