[llvm] f644508 - RISCV: Fix VLOptimizer null dereference on an undef slide amount (#218329)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 00:52:35 PDT 2026
Author: Matt Arsenault
Date: 2026-08-24T09:52:30+02:00
New Revision: f644508a096df2bd92710f066861e21ebf346b15
URL: https://github.com/llvm/llvm-project/commit/f644508a096df2bd92710f066861e21ebf346b15
DIFF: https://github.com/llvm/llvm-project/commit/f644508a096df2bd92710f066861e21ebf346b15.diff
LOG: RISCV: Fix VLOptimizer null dereference on an undef slide amount (#218329)
Also since this is an SSA pass, switch from getUniqueVRegDef
to regular getVRegDef.
Co-Authored-By: Claude <noreply at anthropic.com> (Claude Opus 4.8)
Added:
Modified:
llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
llvm/test/CodeGen/RISCV/rvv/vl-opt-undef-vl.mir
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
index 24f25107073b9..c26f3adfdb085 100644
--- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
+++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
@@ -1044,8 +1044,8 @@ getMinimumVLForVSLIDEDOWN_VX(const MachineOperand &UserOp,
const MachineOperand &SlideAmt = MI.getOperand(3);
if (!SlideAmt.getReg().isVirtual())
return std::nullopt;
- MachineInstr *SlideAmtDef = MRI->getUniqueVRegDef(SlideAmt.getReg());
- if (SlideAmtDef->getOpcode() != RISCV::ADDI ||
+ MachineInstr *SlideAmtDef = MRI->getVRegDef(SlideAmt.getReg());
+ if (!SlideAmtDef || SlideAmtDef->getOpcode() != RISCV::ADDI ||
SlideAmtDef->getOperand(2).getImm() != -AVL.getImm() ||
!SlideAmtDef->getOperand(1).getReg().isVirtual())
return std::nullopt;
diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt-undef-vl.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt-undef-vl.mir
index 71e6c6717c27b..bb64dd9b40845 100644
--- a/llvm/test/CodeGen/RISCV/rvv/vl-opt-undef-vl.mir
+++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt-undef-vl.mir
@@ -1,7 +1,7 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
# RUN: llc -mtriple=riscv64 -mattr=+v -run-pass=riscv-vl-optimizer -o - %s | FileCheck %s
-# Make sure there's no crash with an undef VL operand with no defining
+# Make sure there's no crash with an undef operand that has no defining
# instruction.
---
@@ -16,3 +16,15 @@ body: |
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, undef %vl:gprnox0, 5 /* e32 */, 0 /* tu, mu */
$v8 = COPY %y
...
+---
+name: vslidedown_undef_slideamt
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: vslidedown_undef_slideamt
+ ; CHECK: %src:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1 /* vl=VLMAX */, 6 /* e64 */, 0 /* tu, mu */
+ ; CHECK-NEXT: %v:vr = PseudoVSLIDEDOWN_VX_M1 $noreg, %src, undef %amt:gpr, 1 /* vl */, 6 /* e64 */, 3 /* ta, ma */
+ ; CHECK-NEXT: PseudoVSE64_V_M1 %v, $noreg, 1 /* vl */, 6 /* e64 */
+ %src:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 6, 0
+ %v:vr = PseudoVSLIDEDOWN_VX_M1 $noreg, %src, undef %amt:gpr, 1, 6, 3
+ PseudoVSE64_V_M1 %v, $noreg, 1, 6
+...
More information about the llvm-commits
mailing list