@@ -8464,6 +8464,9 @@ void BoUpSLP::transformNodes() {
8464
8464
for (unsigned VF = VL.size() / 2; VF >= MinVF; VF /= 2) {
8465
8465
for (unsigned Cnt = StartIdx; Cnt + VF <= End; Cnt += VF) {
8466
8466
ArrayRef<Value *> Slice = VL.slice(Cnt, VF);
8467
+ // If any instruction is vectorized already - do not try again.
8468
+ if (getTreeEntry(Slice.front()) || getTreeEntry(Slice.back()))
8469
+ continue;
8467
8470
InstructionsState S = getSameOpcode(Slice, *TLI);
8468
8471
if (!S.getOpcode() || S.isAltShuffle() ||
8469
8472
(S.getOpcode() != Instruction::Load &&
@@ -8472,20 +8475,18 @@ void BoUpSLP::transformNodes() {
8472
8475
UserIgnoreList);
8473
8476
})))
8474
8477
continue;
8475
- if (!getTreeEntry(Slice.front()) && !getTreeEntry(Slice.back())) {
8476
- unsigned PrevSize = VectorizableTree.size();
8477
- buildTree_rec(Slice, 0, EdgeInfo(&E, UINT_MAX));
8478
- if (PrevSize + 1 == VectorizableTree.size() &&
8479
- VectorizableTree[PrevSize]->isGather()) {
8480
- VectorizableTree.pop_back();
8481
- continue;
8482
- }
8483
- E.CombinedEntriesWithIndices.emplace_back(PrevSize, Cnt);
8484
- if (StartIdx == Cnt)
8485
- StartIdx = Cnt + VF;
8486
- if (End == Cnt + VF)
8487
- End = Cnt;
8478
+ unsigned PrevSize = VectorizableTree.size();
8479
+ buildTree_rec(Slice, 0, EdgeInfo(&E, UINT_MAX));
8480
+ if (PrevSize + 1 == VectorizableTree.size() &&
8481
+ VectorizableTree[PrevSize]->isGather()) {
8482
+ VectorizableTree.pop_back();
8483
+ continue;
8488
8484
}
8485
+ E.CombinedEntriesWithIndices.emplace_back(PrevSize, Cnt);
8486
+ if (StartIdx == Cnt)
8487
+ StartIdx = Cnt + VF;
8488
+ if (End == Cnt + VF)
8489
+ End = Cnt;
8489
8490
}
8490
8491
}
8491
8492
}
0 commit comments