[PATCH] D150033: fix stack probe lowering for x86_intrcc
Phoebe Wang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 9 01:32:02 PDT 2023
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf6154364f657: fix stack probe lowering for x86_intrcc (authored by Freax13, committed by pengfei).
Changed prior to commit:
https://reviews.llvm.org/D150033?vs=520157&id=520623#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D150033/new/
https://reviews.llvm.org/D150033
Files:
llvm/lib/Target/X86/X86FrameLowering.cpp
llvm/test/CodeGen/X86/x86-64-intrcc.ll
Index: llvm/test/CodeGen/X86/x86-64-intrcc.ll
===================================================================
--- llvm/test/CodeGen/X86/x86-64-intrcc.ll
+++ llvm/test/CodeGen/X86/x86-64-intrcc.ll
@@ -174,5 +174,22 @@
ret void
}
+define x86_intrcc void @test_stack_allocation(ptr byval(%struct.interrupt_frame) %frame, i64 %err) #1 {
+ ; CHECK-LABEL: test_stack_allocation:
+ ; CHECK: # %bb.0: # %entry
+
+ ;; Ensure that STACKALLOC_W_PROBING isn't emitted.
+ ; CHECK-NOT: # fixed size alloca with probing
+ ;; Ensure that stack space is allocated.
+ ; CHECK: subq $280, %rsp
+entry:
+ %some_allocation = alloca i64
+ ;; Call a un-inlineable function to ensure the allocation isn't put in the red zone.
+ call void @external_function(ptr %some_allocation)
+ ret void
+}
+
+declare void @external_function(ptr)
attributes #0 = { nounwind "frame-pointer"="all" }
+attributes #1 = { nounwind "probe-stack"="inline-asm" }
Index: llvm/lib/Target/X86/X86FrameLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86FrameLowering.cpp
+++ llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -1644,7 +1644,19 @@
Fn.arg_size() == 2) {
StackSize += 8;
MFI.setStackSize(StackSize);
- emitSPUpdate(MBB, MBBI, DL, -8, /*InEpilogue=*/false);
+
+ // Update the stack pointer by pushing a register. This is the instruction
+ // emitted that would be end up being emitted by a call to `emitSPUpdate`.
+ // Hard-coding the update to a push avoids emitting a second
+ // `STACKALLOC_W_PROBING` instruction in the save block: We know that stack
+ // probing isn't needed anyways for an 8-byte update.
+ // Pushing a register leaves us in a similar situation to a regular
+ // function call where we know that the address at (rsp-8) is writeable.
+ // That way we avoid any off-by-ones with stack probing for additional
+ // stack pointer updates later on.
+ BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH64r))
+ .addReg(X86::RAX, RegState::Undef)
+ .setMIFlag(MachineInstr::FrameSetup);
}
// If this is x86-64 and the Red Zone is not disabled, if we are a leaf
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150033.520623.patch
Type: text/x-patch
Size: 2175 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230509/91529f98/attachment-0001.bin>
More information about the llvm-commits
mailing list