[llvm] [WinEH] Take musttail calls into account when unlinking eh records (PR #119702)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 12 05:44:07 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-platform-windows
@llvm/pr-subscribers-backend-x86
Author: Hans (zmodem)
<details>
<summary>Changes</summary>
Exception handling records are unlinked on function return. However, if there is a musttail call before the return, that's the de-facto point of termination and the unlinking instructions must be inserted *before* that.
Fixes #<!-- -->119255
---
Full diff: https://github.com/llvm/llvm-project/pull/119702.diff
2 Files Affected:
- (modified) llvm/lib/Target/X86/X86WinEHState.cpp (+10)
- (added) llvm/test/CodeGen/WinEH/wineh-musttail-call.ll (+32)
``````````diff
diff --git a/llvm/lib/Target/X86/X86WinEHState.cpp b/llvm/lib/Target/X86/X86WinEHState.cpp
index b3e4c70eb57f30..fcbce15564ae37 100644
--- a/llvm/lib/Target/X86/X86WinEHState.cpp
+++ b/llvm/lib/Target/X86/X86WinEHState.cpp
@@ -363,6 +363,16 @@ void WinEHStatePass::emitExceptionRegistrationRecord(Function *F) {
Instruction *T = BB.getTerminator();
if (!isa<ReturnInst>(T))
continue;
+
+ // Back up to any preceding musttail call, the de-facto terminator.
+ Instruction *Prev = T->getPrevNonDebugInstruction();
+ if (isa_and_present<BitCastInst>(Prev))
+ Prev = T->getPrevNonDebugInstruction();
+ if (CallInst *CI = dyn_cast_or_null<CallInst>(Prev)) {
+ if (CI->isMustTailCall())
+ T = CI;
+ }
+
Builder.SetInsertPoint(T);
unlinkExceptionRegistration(Builder);
}
diff --git a/llvm/test/CodeGen/WinEH/wineh-musttail-call.ll b/llvm/test/CodeGen/WinEH/wineh-musttail-call.ll
new file mode 100644
index 00000000000000..7f508090a1bc78
--- /dev/null
+++ b/llvm/test/CodeGen/WinEH/wineh-musttail-call.ll
@@ -0,0 +1,32 @@
+; RUN: llc < %s | FileCheck %s
+
+target triple = "i386-pc-windows-msvc"
+
+; Check that codegen doesn't fail due to wineh inserting instructions between
+; the musttail call and return instruction.
+
+
+define void @test() personality ptr @__CxxFrameHandler3 {
+; CHECK-LABEL: test:
+
+entry:
+ invoke void @foo() to label %try.cont unwind label %catch.dispatch
+
+catch.dispatch:
+ %0 = catchswitch within none [label %catch] unwind to caller
+
+catch:
+ %1 = catchpad within %0 [ptr null, i32 64, ptr null]
+ catchret from %1 to label %try.cont
+
+try.cont:
+; CHECK: movl %{{[a-z0-9]+}}, %fs:0
+; CHECK: jmp _bar
+
+ musttail call void @bar()
+ ret void
+}
+
+declare i32 @__CxxFrameHandler3(...)
+declare void @foo()
+declare void @bar()
``````````
</details>
https://github.com/llvm/llvm-project/pull/119702
More information about the llvm-commits
mailing list