[llvm] [RISCV] Don't truncate MaxAlignment to int when realigning the stack (PR #228225)

Divyansh Yadav via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 1 13:55:53 PDT 2026


https://github.com/schizophrenicmaniac updated https://github.com/llvm/llvm-project/pull/228225

>From a78031382bd865db7298bdc7eb6efbacff2afa86 Mon Sep 17 00:00:00 2001
From: Divyansh Yadav <anshmcs at gmail.com>
Date: Fri, 2 Oct 2026 02:22:56 +0530
Subject: [PATCH 1/2] [RISCV] Add test for realigning the stack to 2^32. NFC

---
 llvm/test/CodeGen/RISCV/pr228084.ll | 39 +++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)
 create mode 100644 llvm/test/CodeGen/RISCV/pr228084.ll

diff --git a/llvm/test/CodeGen/RISCV/pr228084.ll b/llvm/test/CodeGen/RISCV/pr228084.ll
new file mode 100644
index 0000000000000..f9e4a8f2835da
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/pr228084.ll
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s
+
+;; Check that stack alignment >= 2^32 works correctly.
+; FIXME: sp is realigned with `andi sp, sp, 0`, which sets it to zero.
+
+define void @f() {
+; CHECK-LABEL: f:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi sp, sp, -2032
+; CHECK-NEXT:    .cfi_def_cfa_offset 2032
+; CHECK-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    sd s0, 2016(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    .cfi_offset ra, -8
+; CHECK-NEXT:    .cfi_offset s0, -16
+; CHECK-NEXT:    addi s0, sp, 2032
+; CHECK-NEXT:    .cfi_def_cfa s0, 0
+; CHECK-NEXT:    li a0, 1
+; CHECK-NEXT:    slli a0, a0, 33
+; CHECK-NEXT:    addi a0, a0, -2032
+; CHECK-NEXT:    sub sp, sp, a0
+; CHECK-NEXT:    andi sp, sp, 0
+; CHECK-NEXT:    li a0, 1
+; CHECK-NEXT:    slli a0, a0, 32
+; CHECK-NEXT:    add a0, sp, a0
+; CHECK-NEXT:    sd zero, 0(a0)
+; CHECK-NEXT:    addi sp, s0, -2032
+; CHECK-NEXT:    .cfi_def_cfa sp, 2032
+; CHECK-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
+; CHECK-NEXT:    ld s0, 2016(sp) # 8-byte Folded Reload
+; CHECK-NEXT:    .cfi_restore ra
+; CHECK-NEXT:    .cfi_restore s0
+; CHECK-NEXT:    addi sp, sp, 2032
+; CHECK-NEXT:    .cfi_def_cfa_offset 0
+; CHECK-NEXT:    ret
+  %1 = alloca i64, align 4294967296
+  store i64 0, ptr %1, align 4294967296
+  ret void
+}

>From 28dd467f0b611ded5bd03b4eb80beb5e0d61597e Mon Sep 17 00:00:00 2001
From: Divyansh Yadav <anshmcs at gmail.com>
Date: Fri, 2 Oct 2026 02:24:54 +0530
Subject: [PATCH 2/2] [RISCV] Don't truncate MaxAlignment to int when
 realigning the stack

---
 llvm/lib/Target/RISCV/RISCVFrameLowering.cpp | 4 ++--
 llvm/test/CodeGen/RISCV/pr228084.ll          | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
index 7d2539ab3f2da..ac31c070242d8 100644
--- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
@@ -1258,10 +1258,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
       Align MaxAlignment = MFI.getMaxAlign();
 
       const RISCVInstrInfo *TII = STI.getInstrInfo();
-      if (isInt<12>(-(int)MaxAlignment.value())) {
+      if (isInt<12>(-(int64_t)MaxAlignment.value())) {
         BuildMI(MBB, MBBI, DL, TII->get(RISCV::ANDI), SPReg)
             .addReg(SPReg)
-            .addImm(-(int)MaxAlignment.value())
+            .addImm(-(int64_t)MaxAlignment.value())
             .setMIFlag(MachineInstr::FrameSetup);
       } else {
         unsigned ShiftAmount = Log2(MaxAlignment);
diff --git a/llvm/test/CodeGen/RISCV/pr228084.ll b/llvm/test/CodeGen/RISCV/pr228084.ll
index f9e4a8f2835da..3949ab44486fa 100644
--- a/llvm/test/CodeGen/RISCV/pr228084.ll
+++ b/llvm/test/CodeGen/RISCV/pr228084.ll
@@ -2,7 +2,6 @@
 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s
 
 ;; Check that stack alignment >= 2^32 works correctly.
-; FIXME: sp is realigned with `andi sp, sp, 0`, which sets it to zero.
 
 define void @f() {
 ; CHECK-LABEL: f:
@@ -19,7 +18,8 @@ define void @f() {
 ; CHECK-NEXT:    slli a0, a0, 33
 ; CHECK-NEXT:    addi a0, a0, -2032
 ; CHECK-NEXT:    sub sp, sp, a0
-; CHECK-NEXT:    andi sp, sp, 0
+; CHECK-NEXT:    srli a0, sp, 32
+; CHECK-NEXT:    slli sp, a0, 32
 ; CHECK-NEXT:    li a0, 1
 ; CHECK-NEXT:    slli a0, a0, 32
 ; CHECK-NEXT:    add a0, sp, a0



More information about the llvm-commits mailing list