[llvm] RISCV: Fix VLOptimizer null dereference on an undef slide amount (PR #218329)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 23 23:23:34 PDT 2026


https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/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)

>From 9238a0c2979c1869d60086d1c252f7d5675f957e Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Sun, 23 Aug 2026 23:46:19 +0200
Subject: [PATCH] RISCV: Fix VLOptimizer null dereference on an undef slide
 amount

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)
---
 llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp      |  4 ++--
 llvm/test/CodeGen/RISCV/rvv/vl-opt-undef-vl.mir | 14 +++++++++++++-
 2 files changed, 15 insertions(+), 3 deletions(-)

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