diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -4503,11 +4503,13 @@ if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy()) return false; - uint64_t ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType()); + TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType()); + if (ScaleVal.isScalable()) + return false; // Target may not support the required addressing mode. if (ScaleVal != 1 && - !TLI.isLegalScaleForGatherScatter(ScaleVal, ElemSize)) + !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize)) return false; Base = SDB->getValue(BasePtr); diff --git a/llvm/test/CodeGen/RISCV/rvv/pr63459.ll b/llvm/test/CodeGen/RISCV/rvv/pr63459.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/pr63459.ll @@ -0,0 +1,21 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 +; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s + +define void @snork(ptr %arg, %arg1) { +; CHECK-LABEL: snork: +; CHECK: # %bb.0: # %bb +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: vsetvli a2, zero, e64, m2, ta, ma +; CHECK-NEXT: vmul.vx v8, v8, a1 +; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma +; CHECK-NEXT: vmv.v.i v10, 1 +; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma +; CHECK-NEXT: vsoxei64.v v10, (a0), v8 +; CHECK-NEXT: ret +bb: + %getelementptr = getelementptr inbounds , ptr %arg, %arg1 + tail call void @llvm.vp.scatter.nxv2i32.nxv2p0( shufflevector ( insertelement ( poison, i32 1, i32 0), poison, zeroinitializer), align 4 %getelementptr, shufflevector ( insertelement ( poison, i1 true, i64 0), poison, zeroinitializer), i32 4) + ret void +} + +declare void @llvm.vp.scatter.nxv2i32.nxv2p0(, , , i32)