diff options
author | Mel Chen <mel.chen@sifive.com> | 2024-07-16 16:15:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-16 16:15:24 +0800 |
commit | 4eb30cfb3474e3770b465cdb39db3b7f6404c3ef (patch) | |
tree | b9b009d5309d18ace719c9b99c096d2787f839fe /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | 5d12fa7d72a43eb54a3d8f953766323b97da5ca8 (diff) | |
download | llvm-4eb30cfb3474e3770b465cdb39db3b7f6404c3ef.zip llvm-4eb30cfb3474e3770b465cdb39db3b7f6404c3ef.tar.gz llvm-4eb30cfb3474e3770b465cdb39db3b7f6404c3ef.tar.bz2 |
[LV][EVL] Support in-loop reduction using tail folding with EVL. (#90184)
Following from #87816, add VPReductionEVLRecipe to describe vector
predication reduction.
Address one of TODOs from #76172.
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); |