From: David Majnemer Date: Fri, 26 Feb 2016 00:04:25 +0000 (+0000) Subject: [WinEH] Don't remove unannotated inline-asm calls X-Git-Tag: llvmorg-3.9.0-rc1~13192 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08dd52dc756864b1ca917a514eae33064896be3a;p=platform%2Fupstream%2Fllvm.git [WinEH] Don't remove unannotated inline-asm calls Inline-asm calls aren't annotated with funclet bundle operands because they don't throw and cannot be inlined through. We shouldn't require them to bear an funclet bundle operand. llvm-svn: 261942 --- diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp index 8157857..b2b3130 100644 --- a/llvm/lib/CodeGen/WinEHPrepare.cpp +++ b/llvm/lib/CodeGen/WinEHPrepare.cpp @@ -948,10 +948,11 @@ void WinEHPrepare::removeImplausibleInstructions(Function &F) { if (FuncletBundleOperand == FuncletPad) continue; - // Skip call sites which are nounwind intrinsics. + // Skip call sites which are nounwind intrinsics or inline asm. auto *CalledFn = dyn_cast(CS.getCalledValue()->stripPointerCasts()); - if (CalledFn && CalledFn->isIntrinsic() && CS.doesNotThrow()) + if (CalledFn && ((CalledFn->isIntrinsic() && CS.doesNotThrow()) || + CS.isInlineAsm())) continue; // This call site was not part of this funclet, remove it. diff --git a/llvm/test/CodeGen/WinEH/wineh-asm.ll b/llvm/test/CodeGen/WinEH/wineh-asm.ll new file mode 100644 index 0000000..ed99411 --- /dev/null +++ b/llvm/test/CodeGen/WinEH/wineh-asm.ll @@ -0,0 +1,26 @@ +; RUN: opt -winehprepare < %s + +target triple = "x86_64-pc-windows-msvc" + +define void @test1() personality i32 (...)* @__CxxFrameHandler3 { +entry: + invoke void @f(i32 1) + to label %exit unwind label %cleanup + +cleanup: + %cp = cleanuppad within none [] + call void asm sideeffect "", ""() + cleanupret from %cp unwind to caller + +exit: + ret void +} + +; CHECK-LABEL: define void @test1( +; CHECK: %[[cp:.*]] = cleanuppad within none [] +; CHECK-NEXT: call void asm sideeffect "", ""() +; CHECK-NEXT: cleanupret from %[[cp]] unwind to caller + +declare void @f(i32) + +declare i32 @__CxxFrameHandler3(...)