Skip to content

Commit 9a77783

Browse files
committed
fixup! [llvm][RISCV] Support RISCV vector tuple type in llvm IR
1 parent e168bee commit 9a77783

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
@@ -2536,24 +2536,22 @@ let HasMasked = false, HasVL = false, IRName = "" in {
25362536
ManualCodegen = [{
25372537
{
25382538
auto *VecTy = cast<ScalableVectorType>(ResultType);
2539-
// Mask to only valid indices.
2540-
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
25412539
if (auto *OpVecTy = dyn_cast<ScalableVectorType>(Ops[0]->getType())) {
25422540
unsigned MaxIndex = OpVecTy->getMinNumElements() / VecTy->getMinNumElements();
25432541
assert(isPowerOf2_32(MaxIndex));
2542+
// Mask to only valid indices.
2543+
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
25442544
Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
25452545
Ops[1] = Builder.CreateMul(Ops[1],
25462546
ConstantInt::get(Ops[1]->getType(),
25472547
VecTy->getMinNumElements()));
25482548
return Builder.CreateExtractVector(ResultType, Ops[0], Ops[1]);
25492549
}
25502550

2551-
bool IsRISCV64 = getTarget().getTriple().isRISCV64();
2552-
llvm::Type *XLenTy = IsRISCV64 ? Builder.getInt64Ty() :
2553-
Builder.getInt32Ty();
25542551
return Builder.CreateIntrinsic(Intrinsic::riscv_vector_extract,
2555-
{ResultType, Ops[0]->getType(), XLenTy},
2556-
{Ops[0], Ops[1]});
2552+
{ResultType, Ops[0]->getType()},
2553+
{Ops[0], Builder.CreateZExt(Ops[1],
2554+
Builder.getInt32Ty())});
25572555
}
25582556
}] in {
25592557
foreach dst_lmul = ["(SFixedLog2LMUL:0)", "(SFixedLog2LMUL:1)", "(SFixedLog2LMUL:2)"] in {
@@ -2574,25 +2572,23 @@ let HasMasked = false, HasVL = false, IRName = "" in {
25742572
let Name = "vset_v", MaskedPolicyScheme = NonePolicy,
25752573
ManualCodegen = [{
25762574
{
2577-
auto *VecTy = cast<ScalableVectorType>(Ops[2]->getType());
2578-
// Mask to only valid indices.
2579-
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
25802575
if (auto *ResVecTy = dyn_cast<ScalableVectorType>(ResultType)) {
2576+
auto *VecTy = cast<ScalableVectorType>(Ops[2]->getType());
25812577
unsigned MaxIndex = ResVecTy->getMinNumElements() / VecTy->getMinNumElements();
25822578
assert(isPowerOf2_32(MaxIndex));
2579+
// Mask to only valid indices.
2580+
Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
25832581
Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
25842582
Ops[1] = Builder.CreateMul(Ops[1],
25852583
ConstantInt::get(Ops[1]->getType(),
25862584
VecTy->getMinNumElements()));
25872585
return Builder.CreateInsertVector(ResultType, Ops[0], Ops[2], Ops[1]);
25882586
}
25892587

2590-
bool IsRISCV64 = getTarget().getTriple().isRISCV64();
2591-
llvm::Type *XLenTy = IsRISCV64 ? Builder.getInt64Ty() :
2592-
Builder.getInt32Ty();
25932588
return Builder.CreateIntrinsic(Intrinsic::riscv_vector_insert,
2594-
{ResultType, Ops[2]->getType(), XLenTy},
2595-
{Ops[0], Ops[2], Ops[1]});
2589+
{ResultType, Ops[2]->getType()},
2590+
{Ops[0], Ops[2],
2591+
Builder.CreateZExt(Ops[1],Builder.getInt32Ty())});
25962592
}
25972593
}] in {
25982594
foreach dst_lmul = ["(LFixedLog2LMUL:1)", "(LFixedLog2LMUL:2)", "(LFixedLog2LMUL:3)"] in {
@@ -2618,23 +2614,19 @@ let HasMasked = false, HasVL = false, IRName = "" in {
26182614
{
26192615
llvm::Value *ReturnVector = llvm::PoisonValue::get(ResultType);
26202616
auto *VecTy = cast<ScalableVectorType>(Ops[0]->getType());
2621-
bool IsRISCV64 = getTarget().getTriple().isRISCV64();
2622-
llvm::Type *XLenTy = IsRISCV64 ? Builder.getInt64Ty() :
2623-
Builder.getInt32Ty();
26242617
for (unsigned I = 0, N = Ops.size(); I < N; ++I) {
2625-
llvm::Value *Idx =
2626-
ConstantInt::get(Builder.getInt64Ty(),
2627-
isa<ScalableVectorType>(ResultType) ?
2628-
VecTy->getMinNumElements() * I : I);
2629-
2630-
if (isa<ScalableVectorType>(ResultType))
2618+
if (isa<ScalableVectorType>(ResultType)) {
2619+
llvm::Value *Idx = ConstantInt::get(Builder.getInt64Ty(),
2620+
VecTy->getMinNumElements() * I);
26312621
ReturnVector =
26322622
Builder.CreateInsertVector(ResultType, ReturnVector, Ops[I], Idx);
2633-
else
2623+
} else {
2624+
llvm::Value *Idx = ConstantInt::get(Builder.getInt32Ty(), I);
26342625
ReturnVector =
26352626
Builder.CreateIntrinsic(Intrinsic::riscv_vector_insert,
2636-
{ResultType, Ops[I]->getType(), XLenTy},
2627+
{ResultType, Ops[I]->getType()},
26372628
{ReturnVector, Ops[I], Idx});
2629+
}
26382630

26392631
}
26402632
return ReturnVector;

0 commit comments

Comments
 (0)