diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index a127a32..ff93035 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -1192,6 +1192,19 @@ Value *llvm::createSimpleTargetReduction(IRBuilderBase &Builder, Value *Src, } } +Value *llvm::createSimpleTargetReduction(VectorBuilder &VBuilder, Value *Src, + const RecurrenceDescriptor &Desc) { + RecurKind Kind = Desc.getRecurrenceKind(); + assert(!RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind) && + "AnyOf reduction is not supported."); + auto *SrcTy = cast<VectorType>(Src->getType()); + Type *SrcEltTy = SrcTy->getElementType(); + Value *Iden = + Desc.getRecurrenceIdentity(Kind, SrcEltTy, Desc.getFastMathFlags()); + Value *Ops[] = {Iden, Src}; + return VBuilder.createSimpleTargetReduction(Kind, SrcTy, Ops); +} + Value *llvm::createTargetReduction(IRBuilderBase &B, const RecurrenceDescriptor &Desc, Value *Src, PHINode *OrigPhi) { @@ -1220,6 +1233,20 @@ Value *llvm::createOrderedReduction(IRBuilderBase &B, return B.CreateFAddReduce(Start, Src); } +Value *llvm::createOrderedReduction(VectorBuilder &VBuilder, + const RecurrenceDescriptor &Desc, + Value *Src, Value *Start) { + assert((Desc.getRecurrenceKind() == RecurKind::FAdd || + Desc.getRecurrenceKind() == RecurKind::FMulAdd) && + "Unexpected reduction kind"); + assert(Src->getType()->isVectorTy() && "Expected a vector type"); + assert(!Start->getType()->isVectorTy() && "Expected a scalar type"); + + auto *SrcTy = cast<VectorType>(Src->getType()); + Value *Ops[] = {Start, Src}; + return VBuilder.createSimpleTargetReduction(RecurKind::FAdd, SrcTy, Ops); +} + void llvm::propagateIRFlags(Value *I, ArrayRef<Value *> VL, Value *OpValue, bool IncludeWrapFlags) { auto *VecOp = dyn_cast<Instruction>(I); |