@@ -918,6 +918,44 @@ bool llvm::hasIterationCountInvariantInParent(Loop *InnerLoop,
918918 return true ;
919919}
920920
921+ Intrinsic::ID llvm::getReductionIntrinsicID (RecurKind RK) {
922+ switch (RK) {
923+ default :
924+ llvm_unreachable (" Unexpected recurrence kind" );
925+ case RecurKind::Add:
926+ return Intrinsic::vector_reduce_add;
927+ case RecurKind::Mul:
928+ return Intrinsic::vector_reduce_mul;
929+ case RecurKind::And:
930+ return Intrinsic::vector_reduce_and;
931+ case RecurKind::Or:
932+ return Intrinsic::vector_reduce_or;
933+ case RecurKind::Xor:
934+ return Intrinsic::vector_reduce_xor;
935+ case RecurKind::FMulAdd:
936+ case RecurKind::FAdd:
937+ return Intrinsic::vector_reduce_fadd;
938+ case RecurKind::FMul:
939+ return Intrinsic::vector_reduce_fmul;
940+ case RecurKind::SMax:
941+ return Intrinsic::vector_reduce_smax;
942+ case RecurKind::SMin:
943+ return Intrinsic::vector_reduce_smin;
944+ case RecurKind::UMax:
945+ return Intrinsic::vector_reduce_umax;
946+ case RecurKind::UMin:
947+ return Intrinsic::vector_reduce_umin;
948+ case RecurKind::FMax:
949+ return Intrinsic::vector_reduce_fmax;
950+ case RecurKind::FMin:
951+ return Intrinsic::vector_reduce_fmin;
952+ case RecurKind::FMaximum:
953+ return Intrinsic::vector_reduce_fmaximum;
954+ case RecurKind::FMinimum:
955+ return Intrinsic::vector_reduce_fminimum;
956+ }
957+ }
958+
921959unsigned llvm::getArithmeticReductionInstruction (Intrinsic::ID RdxID) {
922960 switch (RdxID) {
923961 case Intrinsic::vector_reduce_fadd:
@@ -1197,12 +1235,13 @@ Value *llvm::createSimpleTargetReduction(VectorBuilder &VBuilder, Value *Src,
11971235 RecurKind Kind = Desc.getRecurrenceKind ();
11981236 assert (!RecurrenceDescriptor::isAnyOfRecurrenceKind (Kind) &&
11991237 " AnyOf reduction is not supported." );
1238+ Intrinsic::ID Id = getReductionIntrinsicID (Kind);
12001239 auto *SrcTy = cast<VectorType>(Src->getType ());
12011240 Type *SrcEltTy = SrcTy->getElementType ();
12021241 Value *Iden =
12031242 Desc.getRecurrenceIdentity (Kind, SrcEltTy, Desc.getFastMathFlags ());
12041243 Value *Ops[] = {Iden, Src};
1205- return VBuilder.createSimpleTargetReduction (Kind , SrcTy, Ops);
1244+ return VBuilder.createSimpleTargetReduction (Id , SrcTy, Ops);
12061245}
12071246
12081247Value *llvm::createTargetReduction (IRBuilderBase &B,
@@ -1242,9 +1281,10 @@ Value *llvm::createOrderedReduction(VectorBuilder &VBuilder,
12421281 assert (Src->getType ()->isVectorTy () && " Expected a vector type" );
12431282 assert (!Start->getType ()->isVectorTy () && " Expected a scalar type" );
12441283
1284+ Intrinsic::ID Id = getReductionIntrinsicID (RecurKind::FAdd);
12451285 auto *SrcTy = cast<VectorType>(Src->getType ());
12461286 Value *Ops[] = {Start, Src};
1247- return VBuilder.createSimpleTargetReduction (RecurKind::FAdd , SrcTy, Ops);
1287+ return VBuilder.createSimpleTargetReduction (Id , SrcTy, Ops);
12481288}
12491289
12501290void llvm::propagateIRFlags (Value *I, ArrayRef<Value *> VL, Value *OpValue,
0 commit comments