[PATCH] D119644: [X86][Win64] Avoid statepoints in trailing call position
Markus Böck via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 14 13:53:23 PST 2022
zero9178 updated this revision to Diff 408605.
zero9178 added a comment.
Address reviewers comments:
- Make use of update_llc_test_checks.py script to generate the output checks
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D119644/new/
https://reviews.llvm.org/D119644
Files:
llvm/include/llvm/CodeGen/MachineInstr.h
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
@@ -70,7 +70,7 @@
// 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();
+ return (!MI.isPseudo() && !MI.isMetaInstruction()) || MI.isStatepoint();
}
// Return true if this is a call instruction, but not a tail call.
Index: llvm/include/llvm/CodeGen/MachineInstr.h
===================================================================
--- llvm/include/llvm/CodeGen/MachineInstr.h
+++ llvm/include/llvm/CodeGen/MachineInstr.h
@@ -1190,6 +1190,8 @@
return isEHLabel() || isGCLabel() || isAnnotationLabel();
}
+ bool isStatepoint() const { return getOpcode() == TargetOpcode::STATEPOINT; }
+
bool isCFIInstruction() const {
return getOpcode() == TargetOpcode::CFI_INSTRUCTION;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119644.408605.patch
Type: text/x-patch
Size: 2249 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220214/84a0374f/attachment.bin>
More information about the llvm-commits
mailing list