[llvm] 8912252 - [PowerPC] Fix wrong codegen when stack pointer has to realign in prologue
Kai Luo via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 21 23:35:40 PDT 2020
Author: Kai Luo
Date: 2020-07-22T06:35:12Z
New Revision: 8912252252c87d8ef6623ecf9fdde444560ee4b9
URL: https://github.com/llvm/llvm-project/commit/8912252252c87d8ef6623ecf9fdde444560ee4b9
DIFF: https://github.com/llvm/llvm-project/commit/8912252252c87d8ef6623ecf9fdde444560ee4b9.diff
LOG: [PowerPC] Fix wrong codegen when stack pointer has to realign in prologue
Current powerpc backend generates wrong code sequence if stack pointer
has to realign if -fstack-clash-protection enabled. When probing in
prologue, backend should generate a subtraction instruction rather
than a `stux` instruction to realign the stack pointer.
This patch is part of fix of
https://bugs.llvm.org/show_bug.cgi?id=46759.
Differential Revision: https://reviews.llvm.org/D84218
Added:
Modified:
llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
llvm/test/CodeGen/PowerPC/pr46759.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
index bd9174c1973d..2ee394e9259d 100644
--- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
@@ -1466,11 +1466,10 @@ void PPCFrameLowering::inlineStackProbe(MachineFunction &MF,
.addImm(0)
.addImm(32 - Log2(MaxAlign))
.addImm(31);
- BuildMI(PrologMBB, {MI}, DL, TII.get(isPPC64 ? PPC::STDUX : PPC::STWUX),
+ BuildMI(PrologMBB, {MI}, DL, TII.get(isPPC64 ? PPC::SUBFC8 : PPC::SUBFC),
SPReg)
- .addReg(FPReg)
- .addReg(SPReg)
- .addReg(ScratchReg);
+ .addReg(ScratchReg)
+ .addReg(SPReg);
}
// Probe residual part.
if (NegResidualSize) {
diff --git a/llvm/test/CodeGen/PowerPC/pr46759.ll b/llvm/test/CodeGen/PowerPC/pr46759.ll
index 2c0af8950099..4d3e8cadc21e 100644
--- a/llvm/test/CodeGen/PowerPC/pr46759.ll
+++ b/llvm/test/CodeGen/PowerPC/pr46759.ll
@@ -12,7 +12,7 @@ define void @foo(i32 %vla_size) #0 {
; CHECK-LE-NEXT: mr r12, r1
; CHECK-LE-NEXT: .cfi_def_cfa r12, 0
; CHECK-LE-NEXT: clrldi r0, r12, 53
-; CHECK-LE-NEXT: stdux r12, r1, r0
+; CHECK-LE-NEXT: subc r1, r1, r0
; CHECK-LE-NEXT: stdu r12, -2048(r1)
; CHECK-LE-NEXT: stdu r12, -4096(r1)
; CHECK-LE-NEXT: .cfi_def_cfa_register r1
More information about the llvm-commits
mailing list