From ef34496b3fc197fe03da6fd86214d5e9b37d4368 Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Thu, 31 Oct 2013 21:56:03 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193808 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/InlineFunction.cpp | 3 +- .../Inline/inline_invoke_with_asm_call.ll | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/Inline/inline_invoke_with_asm_call.ll diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index 585658a8811..56429117f77 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -193,7 +193,8 @@ static bool HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB, CallInst *CI = dyn_cast(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(CI->getCalledValue())) continue; // Convert this function call into an invoke instruction. First, split the diff --git a/test/Transforms/Inline/inline_invoke_with_asm_call.ll b/test/Transforms/Inline/inline_invoke_with_asm_call.ll new file mode 100644 index 00000000000..c1fb57d26b0 --- /dev/null +++ b/test/Transforms/Inline/inline_invoke_with_asm_call.ll @@ -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 + +;