Skip to content

Commit a47cff1

Browse files
committed
fixup! [llvm][RISCV] Support RISCV vector tuple type in llvm IR
1 parent d431547 commit a47cff1

File tree

13 files changed

+2181
-2188
lines changed

13 files changed

+2181
-2188
lines changed

clang/include/clang/Basic/riscv_vector.td

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ multiclass RVVUnitStridedSegLoadTuple<string op> {
766766
IntrinsicTypes = {ResultType, Ops[0]->getType(), Ops.back()->getType()};
767767
else
768768
IntrinsicTypes = {ResultType, Ops.back()->getType()};
769-
SmallVector<llvm::Value*, 12> Operands;
769+
SmallVector<llvm::Value*, 6> Operands;
770770

771771
bool NoPassthru =
772772
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) |
@@ -836,7 +836,7 @@ multiclass RVVUnitStridedSegStoreTuple<string op> {
836836
// Intrinsic: (tuple, ptr, vl)
837837
unsigned Offset = IsMasked ? 1 : 0;
838838

839-
SmallVector<llvm::Value*, 12> Operands;
839+
SmallVector<llvm::Value*, 5> Operands;
840840
Operands.push_back(Ops[Offset + 1]); // tuple
841841
Operands.push_back(Ops[Offset]); // Ptr
842842
if (IsMasked)
@@ -886,7 +886,7 @@ multiclass RVVUnitStridedSegLoadFFTuple<string op> {
886886
IntrinsicTypes = {ResultType, Ops.back()->getType(), Ops[0]->getType()};
887887
else
888888
IntrinsicTypes = {ResultType, Ops.back()->getType()};
889-
SmallVector<llvm::Value*, 12> Operands;
889+
SmallVector<llvm::Value*, 6> Operands;
890890

891891
bool NoPassthru =
892892
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) |
@@ -961,7 +961,7 @@ multiclass RVVStridedSegLoadTuple<string op> {
961961
IntrinsicTypes = {ResultType, Ops.back()->getType(), Ops[0]->getType()};
962962
else
963963
IntrinsicTypes = {ResultType, Ops.back()->getType()};
964-
SmallVector<llvm::Value*, 12> Operands;
964+
SmallVector<llvm::Value*, 7> Operands;
965965

966966
bool NoPassthru =
967967
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) |
@@ -1033,7 +1033,7 @@ multiclass RVVStridedSegStoreTuple<string op> {
10331033
// Intrinsic: (tuple, ptr, stride, vl)
10341034
unsigned Offset = IsMasked ? 1 : 0;
10351035

1036-
SmallVector<llvm::Value*, 12> Operands;
1036+
SmallVector<llvm::Value*, 6> Operands;
10371037
Operands.push_back(Ops[Offset + 2]); // tuple
10381038
Operands.push_back(Ops[Offset]); // Ptr
10391039
Operands.push_back(Ops[Offset + 1]); // Stride
@@ -1075,7 +1075,7 @@ multiclass RVVIndexedSegLoadTuple<string op> {
10751075
[]<string>)),
10761076
ManualCodegen = [{
10771077
{
1078-
SmallVector<llvm::Value*, 12> Operands;
1078+
SmallVector<llvm::Value*, 7> Operands;
10791079

10801080
bool NoPassthru =
10811081
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) |
@@ -1150,7 +1150,7 @@ multiclass RVVIndexedSegStoreTuple<string op> {
11501150
// Intrinsic: (tuple, ptr, index, vl)
11511151
unsigned Offset = IsMasked ? 1 : 0;
11521152

1153-
SmallVector<llvm::Value*, 12> Operands;
1153+
SmallVector<llvm::Value*, 6> Operands;
11541154
Operands.push_back(Ops[Offset + 2]); // tuple
11551155
Operands.push_back(Ops[Offset]); // Ptr
11561156
Operands.push_back(Ops[Offset + 1]); // Idx
@@ -2476,24 +2476,22 @@ let HasMasked = false, HasVL = false, IRName = "" in {
24762476
ManualCodegen = [{
24772477
{
24782478
auto *VecTy = cast<ScalableVectorType>(ResultType);
2479-
// Mask to only valid indices.
2480-
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
24812479
if (auto *OpVecTy = dyn_cast<ScalableVectorType>(Ops[0]->getType())) {
24822480
unsigned MaxIndex = OpVecTy->getMinNumElements() / VecTy->getMinNumElements();
24832481
assert(isPowerOf2_32(MaxIndex));
2482+
// Mask to only valid indices.
2483+
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
24842484
Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
24852485
Ops[1] = Builder.CreateMul(Ops[1],
24862486
ConstantInt::get(Ops[1]->getType(),
24872487
VecTy->getMinNumElements()));
24882488
return Builder.CreateExtractVector(ResultType, Ops[0], Ops[1]);
24892489
}
24902490

2491-
bool IsRISCV64 = getTarget().getTriple().isRISCV64();
2492-
llvm::Type *XLenTy = IsRISCV64 ? Builder.getInt64Ty() :
2493-
Builder.getInt32Ty();
24942491
return Builder.CreateIntrinsic(Intrinsic::riscv_vector_extract,
2495-
{ResultType, Ops[0]->getType(), XLenTy},
2496-
{Ops[0], Ops[1]});
2492+
{ResultType, Ops[0]->getType()},
2493+
{Ops[0], Builder.CreateZExt(Ops[1],
2494+
Builder.getInt32Ty())});
24972495
}
24982496
}] in {
24992497
foreach dst_lmul = ["(SFixedLog2LMUL:0)", "(SFixedLog2LMUL:1)", "(SFixedLog2LMUL:2)"] in {
@@ -2510,25 +2508,23 @@ let HasMasked = false, HasVL = false, IRName = "" in {
25102508
let Name = "vset_v", MaskedPolicyScheme = NonePolicy,
25112509
ManualCodegen = [{
25122510
{
2513-
auto *VecTy = cast<ScalableVectorType>(Ops[2]->getType());
2514-
// Mask to only valid indices.
2515-
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
25162511
if (auto *ResVecTy = dyn_cast<ScalableVectorType>(ResultType)) {
2512+
auto *VecTy = cast<ScalableVectorType>(Ops[2]->getType());
25172513
unsigned MaxIndex = ResVecTy->getMinNumElements() / VecTy->getMinNumElements();
25182514
assert(isPowerOf2_32(MaxIndex));
2515+
// Mask to only valid indices.
2516+
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
25192517
Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
25202518
Ops[1] = Builder.CreateMul(Ops[1],
25212519
ConstantInt::get(Ops[1]->getType(),
25222520
VecTy->getMinNumElements()));
25232521
return Builder.CreateInsertVector(ResultType, Ops[0], Ops[2], Ops[1]);
25242522
}
25252523

2526-
bool IsRISCV64 = getTarget().getTriple().isRISCV64();
2527-
llvm::Type *XLenTy = IsRISCV64 ? Builder.getInt64Ty() :
2528-
Builder.getInt32Ty();
25292524
return Builder.CreateIntrinsic(Intrinsic::riscv_vector_insert,
2530-
{ResultType, Ops[2]->getType(), XLenTy},
2531-
{Ops[0], Ops[2], Ops[1]});
2525+
{ResultType, Ops[2]->getType()},
2526+
{Ops[0], Ops[2],
2527+
Builder.CreateZExt(Ops[1],Builder.getInt32Ty())});
25322528
}
25332529
}] in {
25342530
foreach dst_lmul = ["(LFixedLog2LMUL:1)", "(LFixedLog2LMUL:2)", "(LFixedLog2LMUL:3)"] in {
@@ -2554,23 +2550,19 @@ let HasMasked = false, HasVL = false, IRName = "" in {
25542550
{
25552551
llvm::Value *ReturnVector = llvm::PoisonValue::get(ResultType);
25562552
auto *VecTy = cast<ScalableVectorType>(Ops[0]->getType());
2557-
bool IsRISCV64 = getTarget().getTriple().isRISCV64();
2558-
llvm::Type *XLenTy = IsRISCV64 ? Builder.getInt64Ty() :
2559-
Builder.getInt32Ty();
25602553
for (unsigned I = 0, N = Ops.size(); I < N; ++I) {
2561-
llvm::Value *Idx =
2562-
ConstantInt::get(Builder.getInt64Ty(),
2563-
isa<ScalableVectorType>(ResultType) ?
2564-
VecTy->getMinNumElements() * I : I);
2565-
2566-
if (isa<ScalableVectorType>(ResultType))
2554+
if (isa<ScalableVectorType>(ResultType)) {
2555+
llvm::Value *Idx = ConstantInt::get(Builder.getInt64Ty(),
2556+
VecTy->getMinNumElements() * I);
25672557
ReturnVector =
25682558
Builder.CreateInsertVector(ResultType, ReturnVector, Ops[I], Idx);
2569-
else
2559+
} else {
2560+
llvm::Value *Idx = ConstantInt::get(Builder.getInt32Ty(), I);
25702561
ReturnVector =
25712562
Builder.CreateIntrinsic(Intrinsic::riscv_vector_insert,
2572-
{ResultType, Ops[I]->getType(), XLenTy},
2563+
{ResultType, Ops[I]->getType()},
25732564
{ReturnVector, Ops[I], Idx});
2565+
}
25742566

25752567
}
25762568
return ReturnVector;

0 commit comments

Comments
 (0)