From 20cfdfefcf4a45260d19e324a34eb1751d80d5d2 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 26 Feb 2016 00:04:25 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261942 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/WinEHPrepare.cpp | 5 +++-- test/CodeGen/WinEH/wineh-asm.ll | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/WinEH/wineh-asm.ll diff --git a/lib/CodeGen/WinEHPrepare.cpp b/lib/CodeGen/WinEHPrepare.cpp index 8157857bc25..b2b3130e9f1 100644 --- a/lib/CodeGen/WinEHPrepare.cpp +++ b/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/test/CodeGen/WinEH/wineh-asm.ll b/test/CodeGen/WinEH/wineh-asm.ll new file mode 100644 index 00000000000..ed99411810e --- /dev/null +++ b/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(...) -- 2.11.0