diff --git a/llvm/include/llvm/IR/VectorBuilder.h b/llvm/include/llvm/IR/VectorBuilder.h index b0277c2b52595..d526d52b433b9 100644 --- a/llvm/include/llvm/IR/VectorBuilder.h +++ b/llvm/include/llvm/IR/VectorBuilder.h @@ -87,6 +87,12 @@ class VectorBuilder { StaticVectorLength = ElementCount::getFixed(NewFixedVL); return *this; } + + /// Get the flags to be applied to created floating point ops. + const FastMathFlags &getFastMathFlags() const { + return Builder.getFastMathFlags(); + } + // TODO: setStaticVL(ElementCount) for scalable types. // Emit a VP intrinsic call that mimics a regular instruction. diff --git a/llvm/include/llvm/Transforms/Utils/LoopUtils.h b/llvm/include/llvm/Transforms/Utils/LoopUtils.h index 6823967ebca16..193f505fb03fe 100644 --- a/llvm/include/llvm/Transforms/Utils/LoopUtils.h +++ b/llvm/include/llvm/Transforms/Utils/LoopUtils.h @@ -411,8 +411,7 @@ Value *createSimpleReduction(IRBuilderBase &B, Value *Src, RecurKind RdxKind); /// Overloaded function to generate vector-predication intrinsics for /// reduction. -Value *createSimpleReduction(VectorBuilder &VB, Value *Src, RecurKind RdxKind, - FastMathFlags FMFs); +Value *createSimpleReduction(VectorBuilder &VB, Value *Src, RecurKind RdxKind); /// Create a reduction of the given vector \p Src for a reduction of the /// kind RecurKind::IAnyOf or RecurKind::FAnyOf. The reduction operation is diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 41f43a24e19e6..96d7b3342349e 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -1333,14 +1333,15 @@ Value *llvm::createSimpleReduction(IRBuilderBase &Builder, Value *Src, } Value *llvm::createSimpleReduction(VectorBuilder &VBuilder, Value *Src, - RecurKind Kind, FastMathFlags FMFs) { + RecurKind Kind) { assert(!RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind) && !RecurrenceDescriptor::isFindLastIVRecurrenceKind(Kind) && "AnyOf or FindLastIV reductions are not supported."); Intrinsic::ID Id = getReductionIntrinsicID(Kind); auto *SrcTy = cast(Src->getType()); Type *SrcEltTy = SrcTy->getElementType(); - Value *Iden = getRecurrenceIdentity(Kind, SrcEltTy, FMFs); + Value *Iden = + getRecurrenceIdentity(Kind, SrcEltTy, VBuilder.getFastMathFlags()); Value *Ops[] = {Iden, Src}; return VBuilder.createSimpleReduction(Id, SrcTy, Ops); } diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp index 2d8ca3d4aba34..b40f7e6f99068 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp @@ -2358,7 +2358,7 @@ void VPReductionEVLRecipe::execute(VPTransformState &State) { if (isOrdered()) { NewRed = createOrderedReduction(VBuilder, Kind, VecOp, Prev); } else { - NewRed = createSimpleReduction(VBuilder, VecOp, Kind, getFastMathFlags()); + NewRed = createSimpleReduction(VBuilder, VecOp, Kind); if (RecurrenceDescriptor::isMinMaxRecurrenceKind(Kind)) NewRed = createMinMaxOp(Builder, Kind, NewRed, Prev); else