[llvm] [RISCV] Make sure ADDI isn't a frame index in RISCVMergeBaseOffsetOpt::foldLargeOffset. (PR #228635)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 19:20:46 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Craig Topper (topperc)
<details>
<summary>Changes</summary>
Fixes #<!-- -->228053
---
Full diff: https://github.com/llvm/llvm-project/pull/228635.diff
2 Files Affected:
- (modified) llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp (+3)
- (modified) llvm/test/CodeGen/RISCV/fold-mem-offset.ll (+35)
``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
index b485214d10d8f..c5294d0f8f9ba 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 d4beeae4746da..666968ef6b5e5 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
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/228635
More information about the llvm-commits
mailing list