Skip to content

Commit 479f8d1

Browse files
committed
[RISCV][TTI] Implement instruction costs for vp.reduce.*.
1 parent 00bced2 commit 479f8d1

14 files changed

+1804
-1431
lines changed

llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,75 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
11791179
return getCmpSelInstrCost(Instruction::Select, ICA.getReturnType(),
11801180
ICA.getArgTypes()[0], CmpInst::BAD_ICMP_PREDICATE,
11811181
CostKind);
1182+
case Intrinsic::vp_reduce_add:
1183+
case Intrinsic::vp_reduce_fadd:
1184+
case Intrinsic::vp_reduce_mul:
1185+
case Intrinsic::vp_reduce_fmul:
1186+
case Intrinsic::vp_reduce_and:
1187+
case Intrinsic::vp_reduce_or:
1188+
case Intrinsic::vp_reduce_xor: {
1189+
unsigned Opcode;
1190+
switch (ICA.getID()) {
1191+
case Intrinsic::vp_reduce_add:
1192+
Opcode = Instruction::Add;
1193+
break;
1194+
case Intrinsic::vp_reduce_fadd:
1195+
Opcode = Instruction::FAdd;
1196+
break;
1197+
case Intrinsic::vp_reduce_mul:
1198+
Opcode = Instruction::Mul;
1199+
break;
1200+
case Intrinsic::vp_reduce_fmul:
1201+
Opcode = Instruction::FMul;
1202+
break;
1203+
case Intrinsic::vp_reduce_and:
1204+
Opcode = Instruction::And;
1205+
break;
1206+
case Intrinsic::vp_reduce_or:
1207+
Opcode = Instruction::Or;
1208+
break;
1209+
case Intrinsic::vp_reduce_xor:
1210+
Opcode = Instruction::Xor;
1211+
break;
1212+
}
1213+
return getArithmeticReductionCost(Opcode,
1214+
cast<VectorType>(ICA.getArgTypes()[1]),
1215+
ICA.getFlags(), CostKind);
1216+
}
1217+
case Intrinsic::vp_reduce_smax:
1218+
case Intrinsic::vp_reduce_smin:
1219+
case Intrinsic::vp_reduce_umax:
1220+
case Intrinsic::vp_reduce_umin:
1221+
case Intrinsic::vp_reduce_fmax:
1222+
case Intrinsic::vp_reduce_fmaximum:
1223+
case Intrinsic::vp_reduce_fmin:
1224+
case Intrinsic::vp_reduce_fminimum: {
1225+
unsigned IID;
1226+
switch (ICA.getID()) {
1227+
case Intrinsic::vp_reduce_smax:
1228+
IID = Intrinsic::smax;
1229+
break;
1230+
case Intrinsic::vp_reduce_smin:
1231+
IID = Intrinsic::smin;
1232+
break;
1233+
case Intrinsic::vp_reduce_umax:
1234+
IID = Intrinsic::umax;
1235+
break;
1236+
case Intrinsic::vp_reduce_umin:
1237+
IID = Intrinsic::umin;
1238+
break;
1239+
case Intrinsic::vp_reduce_fmax:
1240+
case Intrinsic::vp_reduce_fmaximum:
1241+
IID = Intrinsic::maximum;
1242+
break;
1243+
case Intrinsic::vp_reduce_fmin:
1244+
case Intrinsic::vp_reduce_fminimum:
1245+
IID = Intrinsic::minimum;
1246+
break;
1247+
}
1248+
return getMinMaxReductionCost(IID, cast<VectorType>(ICA.getArgTypes()[1]),
1249+
ICA.getFlags(), CostKind);
1250+
}
11821251
}
11831252

11841253
if (ST->hasVInstructions() && RetTy->isVectorTy()) {

llvm/test/Analysis/CostModel/RISCV/reduce-add.ll

Lines changed: 102 additions & 64 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-and.ll

Lines changed: 106 additions & 68 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-fadd.ll

Lines changed: 220 additions & 220 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-fmaximum.ll

Lines changed: 112 additions & 112 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-fminimum.ll

Lines changed: 56 additions & 56 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-fmul.ll

Lines changed: 127 additions & 127 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-max.ll

Lines changed: 204 additions & 128 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-min.ll

Lines changed: 204 additions & 128 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-or.ll

Lines changed: 108 additions & 70 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-scalable-fp.ll

Lines changed: 134 additions & 134 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-scalable-int.ll

Lines changed: 228 additions & 228 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/reduce-xor.ll

Lines changed: 102 additions & 64 deletions
Large diffs are not rendered by default.

llvm/test/Analysis/CostModel/RISCV/rvv-intrinsics.ll

Lines changed: 32 additions & 32 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)