@@ -2287,9 +2287,13 @@ class BoUpSLP {
2287
2287
/// a smaller type with a truncation. We collect the values that will be
2288
2288
/// demoted in ToDemote and additional roots that require investigating in
2289
2289
/// Roots.
2290
- bool collectValuesToDemote(Value *V, SmallVectorImpl<Value *> &ToDemote,
2291
- SmallVectorImpl<Value *> &Roots,
2292
- DenseSet<Value *> &Visited) const;
2290
+ /// \param DemotedConsts list of Instruction/OperandIndex pairs that are
2291
+ /// constant and to be demoted. Required to correctly identify constant nodes
2292
+ /// to be demoted.
2293
+ bool collectValuesToDemote(
2294
+ Value *V, SmallVectorImpl<Value *> &ToDemote,
2295
+ DenseMap<Instruction *, SmallVector<unsigned>> &DemotedConsts,
2296
+ SmallVectorImpl<Value *> &Roots, DenseSet<Value *> &Visited) const;
2293
2297
2294
2298
/// Check if the operands on the edges \p Edges of the \p UserTE allows
2295
2299
/// reordering (i.e. the operands can be reordered because they have only one
@@ -2352,6 +2356,9 @@ class BoUpSLP {
2352
2356
/// of a vector of (the same) instruction.
2353
2357
TargetTransformInfo::OperandValueInfo getOperandInfo(ArrayRef<Value *> Ops);
2354
2358
2359
+ /// \ returns the graph entry for the \p Idx operand of the \p E entry.
2360
+ const TreeEntry *getOperandEntry(const TreeEntry *E, unsigned Idx) const;
2361
+
2355
2362
/// \returns the cost of the vectorizable entry.
2356
2363
InstructionCost getEntryCost(const TreeEntry *E,
2357
2364
ArrayRef<Value *> VectorizedVals,
@@ -3594,7 +3601,7 @@ class BoUpSLP {
3594
3601
/// where "width" indicates the minimum bit width and "signed" is True if the
3595
3602
/// value must be signed-extended, rather than zero-extended, back to its
3596
3603
/// original width.
3597
- DenseMap<Value *, std::pair<uint64_t, bool>> MinBWs;
3604
+ DenseMap<const TreeEntry *, std::pair<uint64_t, bool>> MinBWs;
3598
3605
};
3599
3606
3600
3607
} // end namespace slpvectorizer
@@ -7579,7 +7586,36 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
7579
7586
assert((IsFinalized || CommonMask.empty()) &&
7580
7587
"Shuffle construction must be finalized.");
7581
7588
}
7582
- };
7589
+ };
7590
+
7591
+ const BoUpSLP::TreeEntry *BoUpSLP::getOperandEntry(const TreeEntry *E,
7592
+ unsigned Idx) const {
7593
+ Value *Op = E->getOperand(Idx).front();
7594
+ if (const TreeEntry *TE = getTreeEntry(Op)) {
7595
+ if (find_if(E->UserTreeIndices, [&](const EdgeInfo &EI) {
7596
+ return EI.EdgeIdx == Idx && EI.UserTE == E;
7597
+ }) != TE->UserTreeIndices.end())
7598
+ return TE;
7599
+ auto MIt = MultiNodeScalars.find(Op);
7600
+ if (MIt != MultiNodeScalars.end()) {
7601
+ for (const TreeEntry *TE : MIt->second) {
7602
+ if (find_if(TE->UserTreeIndices, [&](const EdgeInfo &EI) {
7603
+ return EI.EdgeIdx == Idx && EI.UserTE == E;
7604
+ }) != TE->UserTreeIndices.end())
7605
+ return TE;
7606
+ }
7607
+ }
7608
+ }
7609
+ const auto *It =
7610
+ find_if(VectorizableTree, [&](const std::unique_ptr<TreeEntry> &TE) {
7611
+ return TE->State == TreeEntry::NeedToGather &&
7612
+ find_if(TE->UserTreeIndices, [&](const EdgeInfo &EI) {
7613
+ return EI.EdgeIdx == Idx && EI.UserTE == E;
7614
+ }) != TE->UserTreeIndices.end();
7615
+ });
7616
+ assert(It != VectorizableTree.end() && "Expected vectorizable entry.");
7617
+ return It->get();
7618
+ }
7583
7619
7584
7620
InstructionCost
7585
7621
BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
@@ -7602,7 +7638,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
7602
7638
7603
7639
// If we have computed a smaller type for the expression, update VecTy so
7604
7640
// that the costs will be accurate.
7605
- auto It = MinBWs.find(VL.front() );
7641
+ auto It = MinBWs.find(E );
7606
7642
if (It != MinBWs.end()) {
7607
7643
ScalarTy = IntegerType::get(F->getContext(), It->second.first);
7608
7644
VecTy = FixedVectorType::get(ScalarTy, VL.size());
@@ -7616,16 +7652,6 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
7616
7652
return 0;
7617
7653
if (isa<InsertElementInst>(VL[0]))
7618
7654
return InstructionCost::getInvalid();
7619
- // The gather nodes use small bitwidth only if all operands use the same
7620
- // bitwidth. Otherwise - use the original one.
7621
- if (It != MinBWs.end() && any_of(VL.drop_front(), [&](Value *V) {
7622
- auto VIt = MinBWs.find(V);
7623
- return VIt == MinBWs.end() || VIt->second.first != It->second.first ||
7624
- VIt->second.second != It->second.second;
7625
- })) {
7626
- ScalarTy = VL.front()->getType();
7627
- VecTy = FixedVectorType::get(ScalarTy, VL.size());
7628
- }
7629
7655
ShuffleCostEstimator Estimator(*TTI, VectorizedVals, *this,
7630
7656
CheckedExtracts);
7631
7657
unsigned VF = E->getVectorFactor();
@@ -7851,7 +7877,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
7851
7877
if ((EI.UserTE->getOpcode() != Instruction::Select ||
7852
7878
EI.EdgeIdx != 0) &&
7853
7879
It != MinBWs.end()) {
7854
- auto UserBWIt = MinBWs.find(EI.UserTE->Scalars.front() );
7880
+ auto UserBWIt = MinBWs.find(EI.UserTE);
7855
7881
Type *UserScalarTy =
7856
7882
EI.UserTE->getOperand(EI.EdgeIdx).front()->getType();
7857
7883
if (UserBWIt != MinBWs.end())
@@ -8144,7 +8170,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
8144
8170
case Instruction::Trunc:
8145
8171
case Instruction::FPTrunc:
8146
8172
case Instruction::BitCast: {
8147
- auto SrcIt = MinBWs.find(VL0->getOperand( 0));
8173
+ auto SrcIt = MinBWs.find(getOperandEntry(E, 0));
8148
8174
Type *SrcScalarTy = VL0->getOperand(0)->getType();
8149
8175
auto *SrcVecTy = FixedVectorType::get(SrcScalarTy, VL.size());
8150
8176
unsigned Opcode = ShuffleOrOp;
@@ -9009,7 +9035,7 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
9009
9035
FirstUsers.emplace_back(VU, ScalarTE);
9010
9036
DemandedElts.push_back(APInt::getZero(FTy->getNumElements()));
9011
9037
VecId = FirstUsers.size() - 1;
9012
- auto It = MinBWs.find(EU.Scalar );
9038
+ auto It = MinBWs.find(ScalarTE );
9013
9039
if (It != MinBWs.end() && VectorCasts.insert(EU.Scalar).second) {
9014
9040
unsigned BWSz = It->second.second;
9015
9041
unsigned SrcBWSz = DL->getTypeSizeInBits(FTy->getElementType());
@@ -9052,7 +9078,7 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
9052
9078
// for the extract and the added cost of the sign extend if needed.
9053
9079
auto *VecTy = FixedVectorType::get(EU.Scalar->getType(), BundleWidth);
9054
9080
TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
9055
- auto It = MinBWs.find(EU.Scalar);
9081
+ auto It = MinBWs.find(getTreeEntry( EU.Scalar) );
9056
9082
if (It != MinBWs.end()) {
9057
9083
auto *MinTy = IntegerType::get(F->getContext(), It->second.first);
9058
9084
unsigned Extend =
@@ -9067,9 +9093,9 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
9067
9093
}
9068
9094
// Add reduced value cost, if resized.
9069
9095
if (!VectorizedVals.empty()) {
9070
- auto BWIt = MinBWs.find(VectorizableTree.front()->Scalars.front ());
9096
+ auto BWIt = MinBWs.find(VectorizableTree.front().get ());
9071
9097
if (BWIt != MinBWs.end()) {
9072
- Type *DstTy = BWIt->first ->getType();
9098
+ Type *DstTy = VectorizableTree.front()->Scalars.front() ->getType();
9073
9099
unsigned OriginalSz = DL->getTypeSizeInBits(DstTy);
9074
9100
unsigned Opcode = Instruction::Trunc;
9075
9101
if (OriginalSz < BWIt->second.first)
@@ -9430,7 +9456,7 @@ BoUpSLP::isGatherShuffledSingleRegisterEntry(
9430
9456
Instruction &LastBundleInst = getLastInstructionInBundle(VTE);
9431
9457
if (&LastBundleInst == TEInsertPt || !CheckOrdering(&LastBundleInst))
9432
9458
continue;
9433
- auto It = MinBWs.find(VTE->Scalars.front() );
9459
+ auto It = MinBWs.find(VTE);
9434
9460
// If vectorize node is demoted - do not match.
9435
9461
if (It != MinBWs.end() &&
9436
9462
It->second.first != DL->getTypeSizeInBits(V->getType()))
@@ -11068,7 +11094,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11068
11094
else if (auto *IE = dyn_cast<InsertElementInst>(VL0))
11069
11095
ScalarTy = IE->getOperand(1)->getType();
11070
11096
bool IsSigned = false;
11071
- auto It = MinBWs.find(E->Scalars.front() );
11097
+ auto It = MinBWs.find(E);
11072
11098
if (It != MinBWs.end()) {
11073
11099
ScalarTy = IntegerType::get(F->getContext(), It->second.first);
11074
11100
IsSigned = It->second.second;
@@ -11130,7 +11156,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11130
11156
Builder.SetCurrentDebugLocation(PH->getDebugLoc());
11131
11157
Value *Vec = vectorizeOperand(E, I, /*PostponedPHIs=*/true);
11132
11158
if (VecTy != Vec->getType()) {
11133
- assert(MinBWs.contains(PH->getIncomingValue( I)) &&
11159
+ assert(MinBWs.contains(getOperandEntry(E, I)) &&
11134
11160
"Expected item in MinBWs.");
11135
11161
Vec = Builder.CreateIntCast(Vec, VecTy, It->second.second);
11136
11162
}
@@ -11167,7 +11193,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11167
11193
Type *ScalarTy = Op.front()->getType();
11168
11194
if (cast<VectorType>(V->getType())->getElementType() != ScalarTy) {
11169
11195
assert(ScalarTy->isIntegerTy() && "Expected item in MinBWs.");
11170
- std::pair<unsigned, bool> Res = MinBWs.lookup(Op.front( ));
11196
+ std::pair<unsigned, bool> Res = MinBWs.lookup(getOperandEntry(E, 1 ));
11171
11197
assert(Res.first > 0 && "Expected item in MinBWs.");
11172
11198
V = Builder.CreateIntCast(
11173
11199
V,
@@ -11342,7 +11368,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11342
11368
auto *CI = cast<CastInst>(VL0);
11343
11369
Instruction::CastOps VecOpcode = CI->getOpcode();
11344
11370
Type *SrcScalarTy = VL0->getOperand(0)->getType();
11345
- auto SrcIt = MinBWs.find(VL0->getOperand( 0));
11371
+ auto SrcIt = MinBWs.find(getOperandEntry(E, 0));
11346
11372
if (!ScalarTy->isFloatingPointTy() && !SrcScalarTy->isFloatingPointTy() &&
11347
11373
(SrcIt != MinBWs.end() || It != MinBWs.end())) {
11348
11374
// Check if the values are candidates to demote.
@@ -11383,8 +11409,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11383
11409
return E->VectorizedValue;
11384
11410
}
11385
11411
if (L->getType() != R->getType()) {
11386
- assert((MinBWs.contains(VL0->getOperand( 0)) ||
11387
- MinBWs.contains(VL0->getOperand( 1))) &&
11412
+ assert((MinBWs.contains(getOperandEntry(E, 0)) ||
11413
+ MinBWs.contains(getOperandEntry(E, 1))) &&
11388
11414
"Expected item in MinBWs.");
11389
11415
L = Builder.CreateIntCast(L, VecTy, IsSigned);
11390
11416
R = Builder.CreateIntCast(R, VecTy, IsSigned);
@@ -11420,8 +11446,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11420
11446
return E->VectorizedValue;
11421
11447
}
11422
11448
if (True->getType() != False->getType()) {
11423
- assert((MinBWs.contains(VL0->getOperand( 1)) ||
11424
- MinBWs.contains(VL0->getOperand( 2))) &&
11449
+ assert((MinBWs.contains(getOperandEntry(E, 1)) ||
11450
+ MinBWs.contains(getOperandEntry(E, 2))) &&
11425
11451
"Expected item in MinBWs.");
11426
11452
True = Builder.CreateIntCast(True, VecTy, IsSigned);
11427
11453
False = Builder.CreateIntCast(False, VecTy, IsSigned);
@@ -11488,8 +11514,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11488
11514
return E->VectorizedValue;
11489
11515
}
11490
11516
if (LHS->getType() != RHS->getType()) {
11491
- assert((MinBWs.contains(VL0->getOperand( 0)) ||
11492
- MinBWs.contains(VL0->getOperand( 1))) &&
11517
+ assert((MinBWs.contains(getOperandEntry(E, 0)) ||
11518
+ MinBWs.contains(getOperandEntry(E, 1))) &&
11493
11519
"Expected item in MinBWs.");
11494
11520
LHS = Builder.CreateIntCast(LHS, VecTy, IsSigned);
11495
11521
RHS = Builder.CreateIntCast(RHS, VecTy, IsSigned);
@@ -11725,8 +11751,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
11725
11751
return E->VectorizedValue;
11726
11752
}
11727
11753
if (LHS && RHS && LHS->getType() != RHS->getType()) {
11728
- assert((MinBWs.contains(VL0->getOperand( 0)) ||
11729
- MinBWs.contains(VL0->getOperand( 1))) &&
11754
+ assert((MinBWs.contains(getOperandEntry(E, 0)) ||
11755
+ MinBWs.contains(getOperandEntry(E, 1))) &&
11730
11756
"Expected item in MinBWs.");
11731
11757
LHS = Builder.CreateIntCast(LHS, VecTy, IsSigned);
11732
11758
RHS = Builder.CreateIntCast(RHS, VecTy, IsSigned);
@@ -11962,7 +11988,7 @@ Value *BoUpSLP::vectorizeTree(
11962
11988
// to the larger type.
11963
11989
if (Scalar->getType() != Ex->getType())
11964
11990
return Builder.CreateIntCast(Ex, Scalar->getType(),
11965
- MinBWs.find(Scalar )->second.second);
11991
+ MinBWs.find(E )->second.second);
11966
11992
return Ex;
11967
11993
}
11968
11994
assert(isa<FixedVectorType>(Scalar->getType()) &&
@@ -12003,7 +12029,7 @@ Value *BoUpSLP::vectorizeTree(
12003
12029
if (!UsedInserts.insert(VU).second)
12004
12030
continue;
12005
12031
// Need to use original vector, if the root is truncated.
12006
- auto BWIt = MinBWs.find(Scalar );
12032
+ auto BWIt = MinBWs.find(E );
12007
12033
if (BWIt != MinBWs.end() && Vec->getType() != VU->getType()) {
12008
12034
auto VecIt = VectorCasts.find(Scalar);
12009
12035
if (VecIt == VectorCasts.end()) {
@@ -13081,22 +13107,22 @@ unsigned BoUpSLP::getVectorElementSize(Value *V) {
13081
13107
// Determine if a value V in a vectorizable expression Expr can be demoted to a
13082
13108
// smaller type with a truncation. We collect the values that will be demoted
13083
13109
// in ToDemote and additional roots that require investigating in Roots.
13084
- bool BoUpSLP::collectValuesToDemote(Value *V,
13085
- SmallVectorImpl<Value *> &ToDemote,
13086
- SmallVectorImpl<Value *> &Roots ,
13087
- DenseSet<Value *> &Visited) const {
13110
+ bool BoUpSLP::collectValuesToDemote(
13111
+ Value *V, SmallVectorImpl<Value *> &ToDemote,
13112
+ DenseMap<Instruction *, SmallVector<unsigned>> &DemotedConsts ,
13113
+ SmallVectorImpl<Value *> &Roots, DenseSet<Value *> &Visited) const {
13088
13114
// We can always demote constants.
13089
- if (isa<Constant>(V)) {
13090
- ToDemote.push_back(V);
13115
+ if (isa<Constant>(V))
13091
13116
return true;
13092
- }
13093
13117
13094
13118
// If the value is not a vectorized instruction in the expression with only
13095
13119
// one use, it cannot be demoted.
13096
13120
auto *I = dyn_cast<Instruction>(V);
13097
13121
if (!I || !I->hasOneUse() || !getTreeEntry(I) || !Visited.insert(I).second)
13098
13122
return false;
13099
13123
13124
+ unsigned Start = 0;
13125
+ unsigned End = I->getNumOperands();
13100
13126
switch (I->getOpcode()) {
13101
13127
13102
13128
// We can always demote truncations and extensions. Since truncations can
@@ -13118,16 +13144,21 @@ bool BoUpSLP::collectValuesToDemote(Value *V,
13118
13144
case Instruction::And:
13119
13145
case Instruction::Or:
13120
13146
case Instruction::Xor:
13121
- if (!collectValuesToDemote(I->getOperand(0), ToDemote, Roots, Visited) ||
13122
- !collectValuesToDemote(I->getOperand(1), ToDemote, Roots, Visited))
13147
+ if (!collectValuesToDemote(I->getOperand(0), ToDemote, DemotedConsts, Roots,
13148
+ Visited) ||
13149
+ !collectValuesToDemote(I->getOperand(1), ToDemote, DemotedConsts, Roots,
13150
+ Visited))
13123
13151
return false;
13124
13152
break;
13125
13153
13126
13154
// We can demote selects if we can demote their true and false values.
13127
13155
case Instruction::Select: {
13156
+ Start = 1;
13128
13157
SelectInst *SI = cast<SelectInst>(I);
13129
- if (!collectValuesToDemote(SI->getTrueValue(), ToDemote, Roots, Visited) ||
13130
- !collectValuesToDemote(SI->getFalseValue(), ToDemote, Roots, Visited))
13158
+ if (!collectValuesToDemote(SI->getTrueValue(), ToDemote, DemotedConsts,
13159
+ Roots, Visited) ||
13160
+ !collectValuesToDemote(SI->getFalseValue(), ToDemote, DemotedConsts,
13161
+ Roots, Visited))
13131
13162
return false;
13132
13163
break;
13133
13164
}
@@ -13137,7 +13168,8 @@ bool BoUpSLP::collectValuesToDemote(Value *V,
13137
13168
case Instruction::PHI: {
13138
13169
PHINode *PN = cast<PHINode>(I);
13139
13170
for (Value *IncValue : PN->incoming_values())
13140
- if (!collectValuesToDemote(IncValue, ToDemote, Roots, Visited))
13171
+ if (!collectValuesToDemote(IncValue, ToDemote, DemotedConsts, Roots,
13172
+ Visited))
13141
13173
return false;
13142
13174
break;
13143
13175
}
@@ -13147,6 +13179,10 @@ bool BoUpSLP::collectValuesToDemote(Value *V,
13147
13179
return false;
13148
13180
}
13149
13181
13182
+ // Gather demoted constant operands.
13183
+ for (unsigned Idx : seq<unsigned>(Start, End))
13184
+ if (isa<Constant>(I->getOperand(Idx)))
13185
+ DemotedConsts.try_emplace(I).first->getSecond().push_back(Idx);
13150
13186
// Record the value that we can demote.
13151
13187
ToDemote.push_back(V);
13152
13188
return true;
@@ -13172,10 +13208,11 @@ void BoUpSLP::computeMinimumValueSizes() {
13172
13208
// expression. Collect the values that can be demoted in ToDemote and
13173
13209
// additional roots that require investigating in Roots.
13174
13210
SmallVector<Value *, 32> ToDemote;
13211
+ DenseMap<Instruction *, SmallVector<unsigned>> DemotedConsts;
13175
13212
SmallVector<Value *, 4> Roots;
13176
13213
for (auto *Root : TreeRoot) {
13177
13214
DenseSet<Value *> Visited;
13178
- if (!collectValuesToDemote(Root, ToDemote, Roots, Visited))
13215
+ if (!collectValuesToDemote(Root, ToDemote, DemotedConsts, Roots, Visited))
13179
13216
return;
13180
13217
}
13181
13218
@@ -13260,26 +13297,36 @@ void BoUpSLP::computeMinimumValueSizes() {
13260
13297
// modify.
13261
13298
while (!Roots.empty()) {
13262
13299
DenseSet<Value *> Visited;
13263
- collectValuesToDemote(Roots.pop_back_val(), ToDemote, Roots, Visited);
13300
+ collectValuesToDemote(Roots.pop_back_val(), ToDemote, DemotedConsts, Roots,
13301
+ Visited);
13264
13302
}
13265
13303
13266
13304
// Finally, map the values we can demote to the maximum bit with we computed.
13267
- DenseMap<const TreeEntry *, bool> Signendness;
13268
13305
for (auto *Scalar : ToDemote) {
13269
- bool IsSigned = true;
13270
- if (auto *TE = getTreeEntry(Scalar)) {
13271
- auto It = Signendness.find(TE);
13272
- if (It != Signendness.end()) {
13273
- IsSigned = It->second;
13274
- } else {
13275
- IsSigned = any_of(TE->Scalars, [&](Value *R) {
13276
- KnownBits Known = computeKnownBits(R, *DL);
13277
- return !Known.isNonNegative();
13278
- });
13279
- Signendness.try_emplace(TE, IsSigned);
13306
+ auto *TE = getTreeEntry(Scalar);
13307
+ assert(TE && "Expected vectorized scalar.");
13308
+ if (MinBWs.contains(TE))
13309
+ continue;
13310
+ bool IsSigned = any_of(TE->Scalars, [&](Value *R) {
13311
+ KnownBits Known = computeKnownBits(R, *DL);
13312
+ return !Known.isNonNegative();
13313
+ });
13314
+ MinBWs.try_emplace(TE, MaxBitWidth, IsSigned);
13315
+ const auto *I = cast<Instruction>(Scalar);
13316
+ auto DCIt = DemotedConsts.find(I);
13317
+ if (DCIt != DemotedConsts.end()) {
13318
+ for (unsigned Idx : DCIt->getSecond()) {
13319
+ // Check that all instructions operands are demoted.
13320
+ if (all_of(TE->Scalars, [&](Value *V) {
13321
+ auto SIt = DemotedConsts.find(cast<Instruction>(V));
13322
+ return SIt != DemotedConsts.end() &&
13323
+ is_contained(SIt->getSecond(), Idx);
13324
+ })) {
13325
+ const TreeEntry *CTE = getOperandEntry(TE, Idx);
13326
+ MinBWs.try_emplace(CTE, MaxBitWidth, IsSigned);
13327
+ }
13280
13328
}
13281
13329
}
13282
- MinBWs.try_emplace(Scalar, MaxBitWidth, IsSigned);
13283
13330
}
13284
13331
}
13285
13332
0 commit comments