Skip to content

Commit 27df1b2

Browse files
authored
[SLPVectorizer] Use TargetFolder (llvm#85800)
Use IRBuilder with TargetFolder in SLPVectorizer to avoid the custom constant folding code. This fixes the remaining part of llvm#61240.
1 parent f0420c7 commit 27df1b2

File tree

1 file changed

+13
-27
lines changed

1 file changed

+13
-27
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,8 +1001,9 @@ class BoUpSLP {
10011001
TargetLibraryInfo *TLi, AAResults *Aa, LoopInfo *Li,
10021002
DominatorTree *Dt, AssumptionCache *AC, DemandedBits *DB,
10031003
const DataLayout *DL, OptimizationRemarkEmitter *ORE)
1004-
: BatchAA(*Aa), F(Func), SE(Se), TTI(Tti), TLI(TLi), LI(Li),
1005-
DT(Dt), AC(AC), DB(DB), DL(DL), ORE(ORE), Builder(Se->getContext()) {
1004+
: BatchAA(*Aa), F(Func), SE(Se), TTI(Tti), TLI(TLi), LI(Li), DT(Dt),
1005+
AC(AC), DB(DB), DL(DL), ORE(ORE),
1006+
Builder(Se->getContext(), TargetFolder(*DL)) {
10061007
CodeMetrics::collectEphemeralValues(F, AC, EphValues);
10071008
// Use the vector register size specified by the target unless overridden
10081009
// by a command-line option.
@@ -3642,7 +3643,7 @@ class BoUpSLP {
36423643
unsigned MinVecRegSize; // Set by cl::opt (default: 128).
36433644

36443645
/// Instruction builder to construct the vectorized tree.
3645-
IRBuilder<> Builder;
3646+
IRBuilder<TargetFolder> Builder;
36463647

36473648
/// A map of scalar integer values to the smallest bit width with which they
36483649
/// can legally be represented. The values map to (width, signed) pairs,
@@ -15031,7 +15032,6 @@ class HorizontalReduction {
1503115032
static Value *createOp(IRBuilderBase &Builder, RecurKind Kind, Value *LHS,
1503215033
Value *RHS, const Twine &Name, bool UseSelect) {
1503315034
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
15034-
bool IsConstant = isConstant(LHS) && isConstant(RHS);
1503515035
switch (Kind) {
1503615036
case RecurKind::Or:
1503715037
if (UseSelect &&
@@ -15053,49 +15053,33 @@ class HorizontalReduction {
1505315053
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
1505415054
Name);
1505515055
case RecurKind::FMax:
15056-
if (IsConstant)
15057-
return ConstantFP::get(LHS->getType(),
15058-
maxnum(cast<ConstantFP>(LHS)->getValueAPF(),
15059-
cast<ConstantFP>(RHS)->getValueAPF()));
1506015056
return Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS);
1506115057
case RecurKind::FMin:
15062-
if (IsConstant)
15063-
return ConstantFP::get(LHS->getType(),
15064-
minnum(cast<ConstantFP>(LHS)->getValueAPF(),
15065-
cast<ConstantFP>(RHS)->getValueAPF()));
1506615058
return Builder.CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS);
1506715059
case RecurKind::FMaximum:
15068-
if (IsConstant)
15069-
return ConstantFP::get(LHS->getType(),
15070-
maximum(cast<ConstantFP>(LHS)->getValueAPF(),
15071-
cast<ConstantFP>(RHS)->getValueAPF()));
1507215060
return Builder.CreateBinaryIntrinsic(Intrinsic::maximum, LHS, RHS);
1507315061
case RecurKind::FMinimum:
15074-
if (IsConstant)
15075-
return ConstantFP::get(LHS->getType(),
15076-
minimum(cast<ConstantFP>(LHS)->getValueAPF(),
15077-
cast<ConstantFP>(RHS)->getValueAPF()));
1507815062
return Builder.CreateBinaryIntrinsic(Intrinsic::minimum, LHS, RHS);
1507915063
case RecurKind::SMax:
15080-
if (IsConstant || UseSelect) {
15064+
if (UseSelect) {
1508115065
Value *Cmp = Builder.CreateICmpSGT(LHS, RHS, Name);
1508215066
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
1508315067
}
1508415068
return Builder.CreateBinaryIntrinsic(Intrinsic::smax, LHS, RHS);
1508515069
case RecurKind::SMin:
15086-
if (IsConstant || UseSelect) {
15070+
if (UseSelect) {
1508715071
Value *Cmp = Builder.CreateICmpSLT(LHS, RHS, Name);
1508815072
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
1508915073
}
1509015074
return Builder.CreateBinaryIntrinsic(Intrinsic::smin, LHS, RHS);
1509115075
case RecurKind::UMax:
15092-
if (IsConstant || UseSelect) {
15076+
if (UseSelect) {
1509315077
Value *Cmp = Builder.CreateICmpUGT(LHS, RHS, Name);
1509415078
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
1509515079
}
1509615080
return Builder.CreateBinaryIntrinsic(Intrinsic::umax, LHS, RHS);
1509715081
case RecurKind::UMin:
15098-
if (IsConstant || UseSelect) {
15082+
if (UseSelect) {
1509915083
Value *Cmp = Builder.CreateICmpULT(LHS, RHS, Name);
1510015084
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
1510115085
}
@@ -15489,7 +15473,7 @@ class HorizontalReduction {
1548915473
}
1549015474

1549115475
/// Attempt to vectorize the tree found by matchAssociativeReduction.
15492-
Value *tryToReduce(BoUpSLP &V, TargetTransformInfo *TTI,
15476+
Value *tryToReduce(BoUpSLP &V, const DataLayout &DL, TargetTransformInfo *TTI,
1549315477
const TargetLibraryInfo &TLI) {
1549415478
constexpr int ReductionLimit = 4;
1549515479
constexpr unsigned RegMaxNumber = 4;
@@ -15515,7 +15499,9 @@ class HorizontalReduction {
1551515499
return nullptr;
1551615500
}
1551715501

15518-
IRBuilder<> Builder(cast<Instruction>(ReductionRoot));
15502+
IRBuilder<TargetFolder> Builder(ReductionRoot->getContext(),
15503+
TargetFolder(DL));
15504+
Builder.SetInsertPoint(cast<Instruction>(ReductionRoot));
1551915505

1552015506
// Track the reduced values in case if they are replaced by extractelement
1552115507
// because of the vectorization.
@@ -16611,7 +16597,7 @@ bool SLPVectorizerPass::vectorizeHorReduction(
1661116597
HorizontalReduction HorRdx;
1661216598
if (!HorRdx.matchAssociativeReduction(R, Inst, *SE, *DL, *TLI))
1661316599
return nullptr;
16614-
return HorRdx.tryToReduce(R, TTI, *TLI);
16600+
return HorRdx.tryToReduce(R, *DL, TTI, *TLI);
1661516601
};
1661616602
auto TryAppendToPostponedInsts = [&](Instruction *FutureSeed) {
1661716603
if (TryOperandsAsNewSeeds && FutureSeed == Root) {

0 commit comments

Comments
 (0)