mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 22:30:33 +00:00
[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
This commit is contained in:
parent
d302ba20c3
commit
473ae5e981
@ -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<Function>(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.
|
||||
|
26
test/CodeGen/WinEH/wineh-asm.ll
Normal file
26
test/CodeGen/WinEH/wineh-asm.ll
Normal file
@ -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(...)
|
Loading…
Reference in New Issue
Block a user