[llvm] 1d07098 - [WinEH] Take musttail calls into account when unlinking eh records (#119702)

via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 13 00:16:57 PST 2024


Author: Hans Wennborg
Date: 2024-12-13T09:16:52+01:00
New Revision: 1d070988d9172965dee227e5629fa886845b815f

URL: https://github.com/llvm/llvm-project/commit/1d070988d9172965dee227e5629fa886845b815f
DIFF: https://github.com/llvm/llvm-project/commit/1d070988d9172965dee227e5629fa886845b815f.diff

LOG: [WinEH] Take musttail calls into account when unlinking eh records (#119702)

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

Added: 
    llvm/test/CodeGen/WinEH/wineh-musttail-call.ll

Modified: 
    llvm/lib/Target/X86/X86WinEHState.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86WinEHState.cpp b/llvm/lib/Target/X86/X86WinEHState.cpp
index b3e4c70eb57f30..35b7d7f508b02f 100644
--- a/llvm/lib/Target/X86/X86WinEHState.cpp
+++ b/llvm/lib/Target/X86/X86WinEHState.cpp
@@ -363,6 +363,11 @@ void WinEHStatePass::emitExceptionRegistrationRecord(Function *F) {
     Instruction *T = BB.getTerminator();
     if (!isa<ReturnInst>(T))
       continue;
+
+    // If there is a musttail call, that's the de-facto terminator.
+    if (CallInst *CI = BB.getTerminatingMustTailCall())
+      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()


        


More information about the llvm-commits mailing list