[PATCH] D119644: [X86][Win64] Avoid statepoints in trailing call position

Markus Böck via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 15 03:17:36 PST 2022


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG78c27a3cee42: [X86][Win64] Avoid statepoints in trailing call position (authored by zero9178).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D119644/new/

https://reviews.llvm.org/D119644

Files:
  llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
  llvm/test/CodeGen/X86/win64-eh-trailing-statepoint.ll


Index: llvm/test/CodeGen/X86/win64-eh-trailing-statepoint.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/win64-eh-trailing-statepoint.ll
@@ -0,0 +1,22 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=x86_64-windows-gnu %s -o - | FileCheck %s
+
+define void @foo() gc "statepoint-example" personality i8* bitcast (i32 (...)* @__gxx_personality_seh0 to i8*) {
+; CHECK-LABEL: foo:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    subq $40, %rsp
+; CHECK-NEXT:    .seh_stackalloc 40
+; CHECK-NEXT:    .seh_endprologue
+; CHECK-NEXT:    callq raise
+; CHECK-NEXT:  .Ltmp0:
+; CHECK-NEXT:    int3
+; CHECK-NEXT:    .seh_endproc
+    %statepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @raise, i32 0, i32 0, i32 0, i32 0)
+    unreachable
+}
+
+declare void @raise()
+
+declare dso_local i32 @__gxx_personality_seh0(...)
+
+declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 immarg, i32 immarg, void ()*, i32 immarg, i32 immarg, ...)
Index: llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
===================================================================
--- llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
+++ llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
@@ -69,8 +69,8 @@
 // A real instruction is a non-meta, non-pseudo instruction.  Some pseudos
 // expand to nothing, and some expand to code. This logic conservatively assumes
 // they might expand to nothing.
-static bool isRealInstruction(MachineInstr &MI) {
-  return !MI.isPseudo() && !MI.isMetaInstruction();
+static bool isCallOrRealInstruction(MachineInstr &MI) {
+  return MI.isCall() || (!MI.isPseudo() && !MI.isMetaInstruction());
 }
 
 // Return true if this is a call instruction, but not a tail call.
@@ -100,7 +100,7 @@
       continue;
 
     // Find the last real instruction in this block.
-    auto LastRealInstr = llvm::find_if(reverse(MBB), isRealInstruction);
+    auto LastRealInstr = llvm::find_if(reverse(MBB), isCallOrRealInstruction);
 
     // If the block is empty or the last real instruction is a call instruction,
     // insert an int3. If there is a call instruction, insert the int3 between


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119644.408796.patch
Type: text/x-patch
Size: 2308 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220215/83c48a2e/attachment.bin>


More information about the llvm-commits mailing list