Skip to content

Commit 17d6bf0

Browse files
authored
[RISCV] Change how MMO is rebuilt in lowerFixedLengthVectorLoadToRVV/lowerFixedLengthVectorStoreToRVV (#88811)
Copy the pointer info, flags, alignment, AAInfo, and ranges, but let getLoad rebuild the MMO using the scalable type used for the the new load/store. This makes sure the LLT minimum size matches the ContainerVT minimum size. This is important since vscale_range may have been used to determine that the fixed vector was the exact size of a scalable vector. Fixes #88799
1 parent f14146f commit 17d6bf0

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10433,14 +10433,10 @@ RISCVTargetLowering::lowerFixedLengthVectorLoadToRVV(SDValue Op,
1043310433
if (MinVLMAX == MaxVLMAX && MinVLMAX == VT.getVectorNumElements() &&
1043410434
getLMUL1VT(ContainerVT).bitsLE(ContainerVT)) {
1043510435
MachineMemOperand *MMO = Load->getMemOperand();
10436-
MachineFunction &MF = DAG.getMachineFunction();
10437-
MMO = MF.getMachineMemOperand(
10438-
MMO, MMO->getPointerInfo(),
10439-
MMO->getMemoryType().isValid()
10440-
? LLT::scalable_vector(1, MMO->getMemoryType().getSizeInBits())
10441-
: MMO->getMemoryType());
1044210436
SDValue NewLoad =
10443-
DAG.getLoad(ContainerVT, DL, Load->getChain(), Load->getBasePtr(), MMO);
10437+
DAG.getLoad(ContainerVT, DL, Load->getChain(), Load->getBasePtr(),
10438+
MMO->getPointerInfo(), MMO->getBaseAlign(), MMO->getFlags(),
10439+
MMO->getAAInfo(), MMO->getRanges());
1044410440
SDValue Result = convertFromScalableVector(VT, NewLoad, DAG, Subtarget);
1044510441
return DAG.getMergeValues({Result, NewLoad.getValue(1)}, DL);
1044610442
}
@@ -10500,14 +10496,9 @@ RISCVTargetLowering::lowerFixedLengthVectorStoreToRVV(SDValue Op,
1050010496
if (MinVLMAX == MaxVLMAX && MinVLMAX == VT.getVectorNumElements() &&
1050110497
getLMUL1VT(ContainerVT).bitsLE(ContainerVT)) {
1050210498
MachineMemOperand *MMO = Store->getMemOperand();
10503-
MachineFunction &MF = DAG.getMachineFunction();
10504-
MMO = MF.getMachineMemOperand(
10505-
MMO, MMO->getPointerInfo(),
10506-
MMO->getMemoryType().isValid()
10507-
? LLT::scalable_vector(1, MMO->getMemoryType().getSizeInBits())
10508-
: MMO->getMemoryType());
1050910499
return DAG.getStore(Store->getChain(), DL, NewValue, Store->getBasePtr(),
10510-
MMO);
10500+
MMO->getPointerInfo(), MMO->getBaseAlign(),
10501+
MMO->getFlags(), MMO->getAAInfo());
1051110502
}
1051210503

1051310504
SDValue VL = getVLOp(VT.getVectorNumElements(), ContainerVT, DL, DAG,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc < %s -mtriple=riscv64-unknown-linux-gnu -mattr=+v | FileCheck %s
3+
4+
define i32 @main() vscale_range(2,2) {
5+
; CHECK-LABEL: main:
6+
; CHECK: # %bb.0: # %vector.body
7+
; CHECK-NEXT: lui a0, 1040368
8+
; CHECK-NEXT: addiw a0, a0, -144
9+
; CHECK-NEXT: vl2re16.v v8, (a0)
10+
; CHECK-NEXT: vs2r.v v8, (zero)
11+
; CHECK-NEXT: li a0, 0
12+
; CHECK-NEXT: ret
13+
vector.body:
14+
%0 = load <16 x i16>, ptr getelementptr ([3 x [23 x [23 x i16]]], ptr null, i64 -10593, i64 1, i64 22, i64 0), align 16
15+
store <16 x i16> %0, ptr null, align 2
16+
%wide.load = load <vscale x 8 x i16>, ptr getelementptr ([3 x [23 x [23 x i16]]], ptr null, i64 -10593, i64 1, i64 22, i64 0), align 16
17+
store <vscale x 8 x i16> %wide.load, ptr null, align 2
18+
ret i32 0
19+
}

0 commit comments

Comments
 (0)