[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