Skip to content

Commit e5bc7e7

Browse files
authored
[RISCV][IA] Always generate masked versions of segment LD/ST [nfc-ish] (#148905)
Goal is to be able to eventually merge some of these code path. Having the mask operand should get dropped cleanly via pattern match.
1 parent ad1cbc0 commit e5bc7e7

File tree

3 files changed

+54
-54
lines changed

3 files changed

+54
-54
lines changed

llvm/lib/Target/RISCV/RISCVInterleavedAccess.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -264,26 +264,30 @@ bool RISCVTargetLowering::lowerDeinterleaveIntrinsicToLoad(
264264
{ResVTy, PtrTy, XLenTy},
265265
{LI->getPointerOperand(), Mask, VL});
266266
} else {
267-
static const Intrinsic::ID IntrIds[] = {
268-
Intrinsic::riscv_vlseg2, Intrinsic::riscv_vlseg3,
269-
Intrinsic::riscv_vlseg4, Intrinsic::riscv_vlseg5,
270-
Intrinsic::riscv_vlseg6, Intrinsic::riscv_vlseg7,
271-
Intrinsic::riscv_vlseg8};
272-
273267
unsigned SEW = DL.getTypeSizeInBits(ResVTy->getElementType());
274268
unsigned NumElts = ResVTy->getElementCount().getKnownMinValue();
275269
Type *VecTupTy = TargetExtType::get(
276270
LI->getContext(), "riscv.vector.tuple",
277271
ScalableVectorType::get(Type::getInt8Ty(LI->getContext()),
278272
NumElts * SEW / 8),
279273
Factor);
280-
281274
Value *VL = Constant::getAllOnesValue(XLenTy);
275+
Value *Mask = Builder.getAllOnesMask(ResVTy->getElementCount());
276+
277+
Function *VlsegNFunc = Intrinsic::getOrInsertDeclaration(
278+
LI->getModule(), ScalableVlsegIntrIds[Factor - 2],
279+
{VecTupTy, PtrTy, Mask->getType(), VL->getType()});
282280

283-
Value *Vlseg = Builder.CreateIntrinsic(
284-
IntrIds[Factor - 2], {VecTupTy, PtrTy, XLenTy},
285-
{PoisonValue::get(VecTupTy), LI->getPointerOperand(), VL,
286-
ConstantInt::get(XLenTy, Log2_64(SEW))});
281+
Value *Operands[] = {
282+
PoisonValue::get(VecTupTy),
283+
LI->getPointerOperand(),
284+
Mask,
285+
VL,
286+
ConstantInt::get(XLenTy,
287+
RISCVVType::TAIL_AGNOSTIC | RISCVVType::MASK_AGNOSTIC),
288+
ConstantInt::get(XLenTy, Log2_64(SEW))};
289+
290+
CallInst *Vlseg = Builder.CreateCall(VlsegNFunc, Operands);
287291

288292
SmallVector<Type *, 2> AggrTypes{Factor, ResVTy};
289293
Return = PoisonValue::get(StructType::get(LI->getContext(), AggrTypes));
@@ -338,12 +342,6 @@ bool RISCVTargetLowering::lowerInterleaveIntrinsicToStore(
338342

339343
Builder.CreateCall(VssegNFunc, Ops);
340344
} else {
341-
static const Intrinsic::ID IntrIds[] = {
342-
Intrinsic::riscv_vsseg2, Intrinsic::riscv_vsseg3,
343-
Intrinsic::riscv_vsseg4, Intrinsic::riscv_vsseg5,
344-
Intrinsic::riscv_vsseg6, Intrinsic::riscv_vsseg7,
345-
Intrinsic::riscv_vsseg8};
346-
347345
unsigned SEW = DL.getTypeSizeInBits(InVTy->getElementType());
348346
unsigned NumElts = InVTy->getElementCount().getKnownMinValue();
349347
Type *VecTupTy = TargetExtType::get(
@@ -352,19 +350,23 @@ bool RISCVTargetLowering::lowerInterleaveIntrinsicToStore(
352350
NumElts * SEW / 8),
353351
Factor);
354352

355-
Function *VssegNFunc = Intrinsic::getOrInsertDeclaration(
356-
SI->getModule(), IntrIds[Factor - 2], {VecTupTy, PtrTy, XLenTy});
357-
358353
Value *VL = Constant::getAllOnesValue(XLenTy);
354+
Value *Mask = Builder.getAllOnesMask(InVTy->getElementCount());
359355

360356
Value *StoredVal = PoisonValue::get(VecTupTy);
361357
for (unsigned i = 0; i < Factor; ++i)
362358
StoredVal = Builder.CreateIntrinsic(
363359
Intrinsic::riscv_tuple_insert, {VecTupTy, InVTy},
364360
{StoredVal, InterleaveValues[i], Builder.getInt32(i)});
365361

366-
Builder.CreateCall(VssegNFunc, {StoredVal, SI->getPointerOperand(), VL,
367-
ConstantInt::get(XLenTy, Log2_64(SEW))});
362+
Function *VssegNFunc = Intrinsic::getOrInsertDeclaration(
363+
SI->getModule(), ScalableVssegIntrIds[Factor - 2],
364+
{VecTupTy, PtrTy, Mask->getType(), VL->getType()});
365+
366+
Value *Operands[] = {StoredVal, SI->getPointerOperand(), Mask, VL,
367+
ConstantInt::get(XLenTy, Log2_64(SEW))};
368+
369+
Builder.CreateCall(VssegNFunc, Operands);
368370
}
369371

370372
return true;
@@ -468,14 +470,12 @@ bool RISCVTargetLowering::lowerInterleavedVPLoad(
468470
NumElts * SEW / 8),
469471
Factor);
470472

471-
Value *PoisonVal = PoisonValue::get(VecTupTy);
472-
473473
Function *VlsegNFunc = Intrinsic::getOrInsertDeclaration(
474474
Load->getModule(), ScalableVlsegIntrIds[Factor - 2],
475475
{VecTupTy, PtrTy, Mask->getType(), EVL->getType()});
476476

477477
Value *Operands[] = {
478-
PoisonVal,
478+
PoisonValue::get(VecTupTy),
479479
Load->getArgOperand(0),
480480
Mask,
481481
EVL,

llvm/test/Transforms/InterleavedAccess/RISCV/addrspace.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ define void @load_factor2(ptr addrspace(1) %ptr) {
2020
define void @load_factor2_vscale(ptr addrspace(1) %ptr) {
2121
; CHECK-LABEL: define void @load_factor2_vscale(
2222
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {
23-
; CHECK-NEXT: [[TMP1:%.*]] = call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlseg2.triscv.vector.tuple_nxv32i8_2t.p1.i64(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) poison, ptr addrspace(1) [[PTR]], i64 -1, i64 5)
23+
; CHECK-NEXT: [[TMP1:%.*]] = call target("riscv.vector.tuple", <vscale x 32 x i8>, 2) @llvm.riscv.vlseg2.mask.triscv.vector.tuple_nxv32i8_2t.p1.nxv8i1.i64(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) poison, ptr addrspace(1) [[PTR]], <vscale x 8 x i1> splat (i1 true), i64 -1, i64 3, i64 5)
2424
; CHECK-NEXT: [[TMP2:%.*]] = call <vscale x 8 x i32> @llvm.riscv.tuple.extract.nxv8i32.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) [[TMP1]], i32 0)
2525
; CHECK-NEXT: [[TMP3:%.*]] = insertvalue { <vscale x 8 x i32>, <vscale x 8 x i32> } poison, <vscale x 8 x i32> [[TMP2]], 0
2626
; CHECK-NEXT: [[TMP4:%.*]] = call <vscale x 8 x i32> @llvm.riscv.tuple.extract.nxv8i32.triscv.vector.tuple_nxv32i8_2t(target("riscv.vector.tuple", <vscale x 32 x i8>, 2) [[TMP1]], i32 1)

0 commit comments

Comments
 (0)