diff --git a/llvm/include/llvm/Transforms/Utils/LoopUtils.h b/llvm/include/llvm/Transforms/Utils/LoopUtils.h --- a/llvm/include/llvm/Transforms/Utils/LoopUtils.h +++ b/llvm/include/llvm/Transforms/Utils/LoopUtils.h @@ -364,6 +364,13 @@ Value *createSelectCmpOp(IRBuilderBase &Builder, Value *StartVal, RecurKind RK, Value *Left, Value *Right); +/// Returns a Min/Max operation in select-cmp form corresponding to +/// MinMaxRecurrenceKind. +/// Select(Cmp(strict min max predicate, Left, Right), Left, Right) +/// The Builder's fast-math-flags must be set to propagate the expected values. +Value *createMinMaxSelectCmpOp(IRBuilderBase &Builder, RecurKind RK, + Value *Left, Value *Right); + /// Returns a Min/Max operation corresponding to MinMaxRecurrenceKind. /// The Builder's fast-math-flags must be set to propagate the expected values. Value *createMinMaxOp(IRBuilderBase &Builder, RecurKind RK, Value *Left, diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -940,6 +940,14 @@ return Builder.CreateSelect(Cmp, Left, Right, "rdx.select"); } +Value *llvm::createMinMaxSelectCmpOp(IRBuilderBase &Builder, RecurKind RK, + Value *Left, Value *Right) { + CmpInst::Predicate Pred = getMinMaxReductionPredicate(RK); + Value *Cmp = Builder.CreateCmp(Pred, Left, Right, "rdx.minmax.cmp"); + Value *Select = Builder.CreateSelect(Cmp, Left, Right, "rdx.minmax.select"); + return Select; +} + Value *llvm::createMinMaxOp(IRBuilderBase &Builder, RecurKind RK, Value *Left, Value *Right) { Type *Ty = Left->getType(); @@ -949,10 +957,7 @@ return Builder.CreateIntrinsic(Ty, Id, {Left, Right}, nullptr, "rdx.minmax"); } - CmpInst::Predicate Pred = getMinMaxReductionPredicate(RK); - Value *Cmp = Builder.CreateCmp(Pred, Left, Right, "rdx.minmax.cmp"); - Value *Select = Builder.CreateSelect(Cmp, Left, Right, "rdx.minmax.select"); - return Select; + return createMinMaxSelectCmpOp(Builder, RK, Left, Right); } // Helper to generate an ordered reduction.