[llvm] [RISCV] Make sure ADDI isn't a frame index in RISCVMergeBaseOffsetOpt::foldLargeOffset. (PR #228635)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 19:20:04 PDT 2026
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/228635
Fixes #228053
>From d30a2d5a7fb35ca50b2745a8bb9b6f1f4b1e0602 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Fri, 2 Oct 2026 19:17:50 -0700
Subject: [PATCH] [RISCV] Make sure ADDI isn't a frame index in
RISCVMergeBaseOffsetOpt::foldLargeOffset.
Fixes #228053
---
.../lib/Target/RISCV/RISCVMergeBaseOffset.cpp | 3 ++
llvm/test/CodeGen/RISCV/fold-mem-offset.ll | 35 +++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
index b485214d10d8f08..c5294d0f8f9baf9 100644
--- a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
@@ -220,6 +220,9 @@ bool RISCVMergeBaseOffsetOpt::foldLargeOffset(MachineInstr &Hi,
MachineOperand &AddiImmOp = OffsetTail.getOperand(2);
if (AddiImmOp.getTargetFlags() != RISCVII::MO_None)
return false;
+ // Make sure this isn't something weird like a frame index.
+ if (!OffsetTail.getOperand(1).isReg())
+ return false;
Register AddiReg = OffsetTail.getOperand(1).getReg();
int64_t OffLo = AddiImmOp.getImm();
diff --git a/llvm/test/CodeGen/RISCV/fold-mem-offset.ll b/llvm/test/CodeGen/RISCV/fold-mem-offset.ll
index d4beeae4746da40..666968ef6b5e511 100644
--- a/llvm/test/CodeGen/RISCV/fold-mem-offset.ll
+++ b/llvm/test/CodeGen/RISCV/fold-mem-offset.ll
@@ -730,3 +730,38 @@ entry:
%add4 = add i8 %1, %0
ret i8 %add4
}
+
+%union.u0 = type { [0 x i8] }
+
+declare void @f4()
+
+; Make sure we don't crash when we find an global added to a frame index ADDI.
+define ptr @pr228053_frameindex_crash() {
+; CHECK-LABEL: pr228053_frameindex_crash:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: addi sp, sp, -16
+; CHECK-NEXT: .cfi_def_cfa_offset 16
+; CHECK-NEXT: lui a0, %hi(f4)
+; CHECK-NEXT: addi a0, a0, %lo(f4)
+; CHECK-NEXT: addi a1, sp, 15
+; CHECK-NEXT: add a0, a1, a0
+; CHECK-NEXT: addi sp, sp, 16
+; CHECK-NEXT: .cfi_def_cfa_offset 0
+; CHECK-NEXT: ret
+;
+; ZBA-LABEL: pr228053_frameindex_crash:
+; ZBA: # %bb.0: # %entry
+; ZBA-NEXT: addi sp, sp, -16
+; ZBA-NEXT: .cfi_def_cfa_offset 16
+; ZBA-NEXT: lui a0, %hi(f4)
+; ZBA-NEXT: addi a0, a0, %lo(f4)
+; ZBA-NEXT: addi a1, sp, 15
+; ZBA-NEXT: add a0, a1, a0
+; ZBA-NEXT: addi sp, sp, 16
+; ZBA-NEXT: .cfi_def_cfa_offset 0
+; ZBA-NEXT: ret
+entry:
+ %un18 = alloca %union.u0, align 1
+ %arrayidx1 = getelementptr i8, ptr %un18, i64 ptrtoint (ptr @f4 to i64)
+ ret ptr %arrayidx1
+}
More information about the llvm-commits
mailing list