mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 22:26:14 +00:00
Vectorize: Remove implicit ilist iterator conversions, NFC
Besides the usual, I finally added an overload to `BasicBlock::splitBasicBlock()` that accepts an `Instruction*` instead of `BasicBlock::iterator`. Someone can go back and remove this overload later (after updating the callers I'm going to skip going forward), but the most common call seems to be `BB->splitBasicBlock(BB->getTerminator(), ...)` and I'm not sure it's better to add `->getIterator()` to every one than have the overload. It's pretty hard to get the usage wrong. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250745 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3b75c0484a
commit
f792618d1c
@ -290,6 +290,9 @@ public:
|
||||
/// Also note that this doesn't preserve any passes. To split blocks while
|
||||
/// keeping loop information consistent, use the SplitBlock utility function.
|
||||
BasicBlock *splitBasicBlock(iterator I, const Twine &BBName = "");
|
||||
BasicBlock *splitBasicBlock(Instruction *I, const Twine &BBName = "") {
|
||||
return splitBasicBlock(I->getIterator(), BBName);
|
||||
}
|
||||
|
||||
/// \brief Returns true if there are any uses of this basic block other than
|
||||
/// direct branches, switches, etc. to it.
|
||||
|
@ -1247,20 +1247,23 @@ namespace {
|
||||
if (I == Start) IAfterStart = true;
|
||||
|
||||
bool IsSimpleLoadStore;
|
||||
if (!isInstVectorizable(I, IsSimpleLoadStore)) continue;
|
||||
if (!isInstVectorizable(&*I, IsSimpleLoadStore))
|
||||
continue;
|
||||
|
||||
// Look for an instruction with which to pair instruction *I...
|
||||
DenseSet<Value *> Users;
|
||||
AliasSetTracker WriteSet(*AA);
|
||||
if (I->mayWriteToMemory()) WriteSet.add(I);
|
||||
if (I->mayWriteToMemory())
|
||||
WriteSet.add(&*I);
|
||||
|
||||
bool JAfterStart = IAfterStart;
|
||||
BasicBlock::iterator J = std::next(I);
|
||||
for (unsigned ss = 0; J != E && ss <= Config.SearchLimit; ++J, ++ss) {
|
||||
if (J == Start) JAfterStart = true;
|
||||
if (&*J == Start)
|
||||
JAfterStart = true;
|
||||
|
||||
// Determine if J uses I, if so, exit the loop.
|
||||
bool UsesI = trackUsesOfI(Users, WriteSet, I, J, !Config.FastDep);
|
||||
bool UsesI = trackUsesOfI(Users, WriteSet, &*I, &*J, !Config.FastDep);
|
||||
if (Config.FastDep) {
|
||||
// Note: For this heuristic to be effective, independent operations
|
||||
// must tend to be intermixed. This is likely to be true from some
|
||||
@ -1277,25 +1280,26 @@ namespace {
|
||||
// J does not use I, and comes before the first use of I, so it can be
|
||||
// merged with I if the instructions are compatible.
|
||||
int CostSavings, FixedOrder;
|
||||
if (!areInstsCompatible(I, J, IsSimpleLoadStore, NonPow2Len,
|
||||
CostSavings, FixedOrder)) continue;
|
||||
if (!areInstsCompatible(&*I, &*J, IsSimpleLoadStore, NonPow2Len,
|
||||
CostSavings, FixedOrder))
|
||||
continue;
|
||||
|
||||
// J is a candidate for merging with I.
|
||||
if (PairableInsts.empty() ||
|
||||
PairableInsts[PairableInsts.size()-1] != I) {
|
||||
PairableInsts.push_back(I);
|
||||
PairableInsts[PairableInsts.size() - 1] != &*I) {
|
||||
PairableInsts.push_back(&*I);
|
||||
}
|
||||
|
||||
CandidatePairs[I].push_back(J);
|
||||
CandidatePairs[&*I].push_back(&*J);
|
||||
++TotalPairs;
|
||||
if (TTI)
|
||||
CandidatePairCostSavings.insert(ValuePairWithCost(ValuePair(I, J),
|
||||
CostSavings));
|
||||
CandidatePairCostSavings.insert(
|
||||
ValuePairWithCost(ValuePair(&*I, &*J), CostSavings));
|
||||
|
||||
if (FixedOrder == 1)
|
||||
FixedOrderPairs.insert(ValuePair(I, J));
|
||||
FixedOrderPairs.insert(ValuePair(&*I, &*J));
|
||||
else if (FixedOrder == -1)
|
||||
FixedOrderPairs.insert(ValuePair(J, I));
|
||||
FixedOrderPairs.insert(ValuePair(&*J, &*I));
|
||||
|
||||
// The next call to this function must start after the last instruction
|
||||
// selected during this invocation.
|
||||
@ -1476,14 +1480,16 @@ namespace {
|
||||
BasicBlock::iterator E = BB.end(), EL =
|
||||
BasicBlock::iterator(cast<Instruction>(PairableInsts.back()));
|
||||
for (BasicBlock::iterator I = BB.getFirstInsertionPt(); I != E; ++I) {
|
||||
if (IsInPair.find(I) == IsInPair.end()) continue;
|
||||
if (IsInPair.find(&*I) == IsInPair.end())
|
||||
continue;
|
||||
|
||||
DenseSet<Value *> Users;
|
||||
AliasSetTracker WriteSet(*AA);
|
||||
if (I->mayWriteToMemory()) WriteSet.add(I);
|
||||
if (I->mayWriteToMemory())
|
||||
WriteSet.add(&*I);
|
||||
|
||||
for (BasicBlock::iterator J = std::next(I); J != E; ++J) {
|
||||
(void) trackUsesOfI(Users, WriteSet, I, J);
|
||||
(void)trackUsesOfI(Users, WriteSet, &*I, &*J);
|
||||
|
||||
if (J == EL)
|
||||
break;
|
||||
@ -1492,7 +1498,7 @@ namespace {
|
||||
for (DenseSet<Value *>::iterator U = Users.begin(), E = Users.end();
|
||||
U != E; ++U) {
|
||||
if (IsInPair.find(*U) == IsInPair.end()) continue;
|
||||
PairableInstUsers.insert(ValuePair(I, *U));
|
||||
PairableInstUsers.insert(ValuePair(&*I, *U));
|
||||
}
|
||||
|
||||
if (I == EL)
|
||||
@ -2873,7 +2879,7 @@ namespace {
|
||||
if (I->mayWriteToMemory()) WriteSet.add(I);
|
||||
|
||||
for (; cast<Instruction>(L) != J; ++L)
|
||||
(void) trackUsesOfI(Users, WriteSet, I, L, true, &LoadMoveSetPairs);
|
||||
(void)trackUsesOfI(Users, WriteSet, I, &*L, true, &LoadMoveSetPairs);
|
||||
|
||||
assert(cast<Instruction>(L) == J &&
|
||||
"Tracking has not proceeded far enough to check for dependencies");
|
||||
@ -2895,9 +2901,9 @@ namespace {
|
||||
if (I->mayWriteToMemory()) WriteSet.add(I);
|
||||
|
||||
for (; cast<Instruction>(L) != J;) {
|
||||
if (trackUsesOfI(Users, WriteSet, I, L, true, &LoadMoveSetPairs)) {
|
||||
if (trackUsesOfI(Users, WriteSet, I, &*L, true, &LoadMoveSetPairs)) {
|
||||
// Move this instruction
|
||||
Instruction *InstToMove = L; ++L;
|
||||
Instruction *InstToMove = &*L++;
|
||||
|
||||
DEBUG(dbgs() << "BBV: moving: " << *InstToMove <<
|
||||
" to after " << *InsertionPt << "\n");
|
||||
@ -2928,11 +2934,11 @@ namespace {
|
||||
// Note: We cannot end the loop when we reach J because J could be moved
|
||||
// farther down the use chain by another instruction pairing. Also, J
|
||||
// could be before I if this is an inverted input.
|
||||
for (BasicBlock::iterator E = BB.end(); cast<Instruction>(L) != E; ++L) {
|
||||
if (trackUsesOfI(Users, WriteSet, I, L)) {
|
||||
for (BasicBlock::iterator E = BB.end(); L != E; ++L) {
|
||||
if (trackUsesOfI(Users, WriteSet, I, &*L)) {
|
||||
if (L->mayReadFromMemory()) {
|
||||
LoadMoveSet[L].push_back(I);
|
||||
LoadMoveSetPairs.insert(ValuePair(L, I));
|
||||
LoadMoveSet[&*L].push_back(I);
|
||||
LoadMoveSetPairs.insert(ValuePair(&*L, I));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2995,7 +3001,7 @@ namespace {
|
||||
DEBUG(dbgs() << "BBV: initial: \n" << BB << "\n");
|
||||
|
||||
for (BasicBlock::iterator PI = BB.getFirstInsertionPt(); PI != BB.end();) {
|
||||
DenseMap<Value *, Value *>::iterator P = ChosenPairs.find(PI);
|
||||
DenseMap<Value *, Value *>::iterator P = ChosenPairs.find(&*PI);
|
||||
if (P == ChosenPairs.end()) {
|
||||
++PI;
|
||||
continue;
|
||||
|
@ -2608,8 +2608,8 @@ PHINode *InnerLoopVectorizer::createInductionVariable(Loop *L,
|
||||
// yet. If so, use the header as this will be a single block loop.
|
||||
if (!Latch)
|
||||
Latch = Header;
|
||||
|
||||
IRBuilder<> Builder(Header->getFirstInsertionPt());
|
||||
|
||||
IRBuilder<> Builder(&*Header->getFirstInsertionPt());
|
||||
setDebugLocFromInst(Builder, getDebugLocFromInstOrOperands(OldInduction));
|
||||
auto *Induction = Builder.CreatePHI(Start->getType(), 2, "index");
|
||||
|
||||
@ -2950,7 +2950,7 @@ void InnerLoopVectorizer::createEmptyLoop() {
|
||||
BranchInst::Create(ExitBlock, ScalarPH, CmpN));
|
||||
|
||||
// Get ready to start creating new instructions into the vectorized body.
|
||||
Builder.SetInsertPoint(VecBody->getFirstInsertionPt());
|
||||
Builder.SetInsertPoint(&*VecBody->getFirstInsertionPt());
|
||||
|
||||
// Save the state.
|
||||
LoopVectorPreHeader = Lp->getLoopPreheader();
|
||||
@ -3006,7 +3006,7 @@ static void cse(SmallVector<BasicBlock *, 4> &BBs) {
|
||||
for (unsigned i = 0, e = BBs.size(); i != e; ++i) {
|
||||
BasicBlock *BB = BBs[i];
|
||||
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;) {
|
||||
Instruction *In = I++;
|
||||
Instruction *In = &*I++;
|
||||
|
||||
if (!CSEDenseMapInfo::canHandle(In))
|
||||
continue;
|
||||
@ -3364,7 +3364,7 @@ void InnerLoopVectorizer::vectorizeLoop() {
|
||||
// the PHIs and the values we are going to write.
|
||||
// This allows us to write both PHINodes and the extractelement
|
||||
// instructions.
|
||||
Builder.SetInsertPoint(LoopMiddleBlock->getFirstInsertionPt());
|
||||
Builder.SetInsertPoint(&*LoopMiddleBlock->getFirstInsertionPt());
|
||||
|
||||
VectorParts RdxParts = getVectorValue(LoopExitInst);
|
||||
setDebugLocFromInst(Builder, LoopExitInst);
|
||||
@ -3388,7 +3388,7 @@ void InnerLoopVectorizer::vectorizeLoop() {
|
||||
++UI;
|
||||
}
|
||||
}
|
||||
Builder.SetInsertPoint(LoopMiddleBlock->getFirstInsertionPt());
|
||||
Builder.SetInsertPoint(&*LoopMiddleBlock->getFirstInsertionPt());
|
||||
for (unsigned part = 0; part < UF; ++part)
|
||||
RdxParts[part] = Builder.CreateTrunc(RdxParts[part], RdxVecTy);
|
||||
}
|
||||
@ -3502,8 +3502,8 @@ void InnerLoopVectorizer::vectorizeLoop() {
|
||||
// Predicate any stores.
|
||||
for (auto KV : PredicatedStores) {
|
||||
BasicBlock::iterator I(KV.first);
|
||||
auto *BB = SplitBlock(I->getParent(), std::next(I), DT, LI);
|
||||
auto *T = SplitBlockAndInsertIfThen(KV.second, I, /*Unreachable=*/false,
|
||||
auto *BB = SplitBlock(I->getParent(), &*std::next(I), DT, LI);
|
||||
auto *T = SplitBlockAndInsertIfThen(KV.second, &*I, /*Unreachable=*/false,
|
||||
/*BranchWeights=*/nullptr, DT);
|
||||
I->moveBefore(T);
|
||||
I->getParent()->setName("pred.store.if");
|
||||
@ -3594,8 +3594,8 @@ void InnerLoopVectorizer::widenPHIInstruction(Instruction *PN,
|
||||
// This is phase one of vectorizing PHIs.
|
||||
Type *VecTy = (VF == 1) ? PN->getType() :
|
||||
VectorType::get(PN->getType(), VF);
|
||||
Entry[part] = PHINode::Create(VecTy, 2, "vec.phi",
|
||||
LoopVectorBody.back()-> getFirstInsertionPt());
|
||||
Entry[part] = PHINode::Create(
|
||||
VecTy, 2, "vec.phi", &*LoopVectorBody.back()->getFirstInsertionPt());
|
||||
}
|
||||
PV->push_back(P);
|
||||
return;
|
||||
@ -3706,7 +3706,7 @@ void InnerLoopVectorizer::widenPHIInstruction(Instruction *PN,
|
||||
void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
// For each instruction in the old loop.
|
||||
for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e; ++it) {
|
||||
VectorParts &Entry = WidenMap.get(it);
|
||||
VectorParts &Entry = WidenMap.get(&*it);
|
||||
|
||||
switch (it->getOpcode()) {
|
||||
case Instruction::Br:
|
||||
@ -3715,7 +3715,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
continue;
|
||||
case Instruction::PHI: {
|
||||
// Vectorize PHINodes.
|
||||
widenPHIInstruction(it, Entry, UF, VF, PV);
|
||||
widenPHIInstruction(&*it, Entry, UF, VF, PV);
|
||||
continue;
|
||||
}// End of PHI.
|
||||
|
||||
@ -3753,7 +3753,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
Entry[Part] = V;
|
||||
}
|
||||
|
||||
propagateMetadata(Entry, it);
|
||||
propagateMetadata(Entry, &*it);
|
||||
break;
|
||||
}
|
||||
case Instruction::Select: {
|
||||
@ -3762,7 +3762,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
// instruction with a scalar condition. Otherwise, use vector-select.
|
||||
bool InvariantCond = SE->isLoopInvariant(SE->getSCEV(it->getOperand(0)),
|
||||
OrigLoop);
|
||||
setDebugLocFromInst(Builder, it);
|
||||
setDebugLocFromInst(Builder, &*it);
|
||||
|
||||
// The condition can be loop invariant but still defined inside the
|
||||
// loop. This means that we can't just use the original 'cond' value.
|
||||
@ -3782,7 +3782,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
Op1[Part]);
|
||||
}
|
||||
|
||||
propagateMetadata(Entry, it);
|
||||
propagateMetadata(Entry, &*it);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3791,27 +3791,27 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
// Widen compares. Generate vector compares.
|
||||
bool FCmp = (it->getOpcode() == Instruction::FCmp);
|
||||
CmpInst *Cmp = dyn_cast<CmpInst>(it);
|
||||
setDebugLocFromInst(Builder, it);
|
||||
setDebugLocFromInst(Builder, &*it);
|
||||
VectorParts &A = getVectorValue(it->getOperand(0));
|
||||
VectorParts &B = getVectorValue(it->getOperand(1));
|
||||
for (unsigned Part = 0; Part < UF; ++Part) {
|
||||
Value *C = nullptr;
|
||||
if (FCmp) {
|
||||
C = Builder.CreateFCmp(Cmp->getPredicate(), A[Part], B[Part]);
|
||||
cast<FCmpInst>(C)->copyFastMathFlags(it);
|
||||
cast<FCmpInst>(C)->copyFastMathFlags(&*it);
|
||||
} else {
|
||||
C = Builder.CreateICmp(Cmp->getPredicate(), A[Part], B[Part]);
|
||||
}
|
||||
Entry[Part] = C;
|
||||
}
|
||||
|
||||
propagateMetadata(Entry, it);
|
||||
propagateMetadata(Entry, &*it);
|
||||
break;
|
||||
}
|
||||
|
||||
case Instruction::Store:
|
||||
case Instruction::Load:
|
||||
vectorizeMemoryInstruction(it);
|
||||
vectorizeMemoryInstruction(&*it);
|
||||
break;
|
||||
case Instruction::ZExt:
|
||||
case Instruction::SExt:
|
||||
@ -3826,7 +3826,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
case Instruction::FPTrunc:
|
||||
case Instruction::BitCast: {
|
||||
CastInst *CI = dyn_cast<CastInst>(it);
|
||||
setDebugLocFromInst(Builder, it);
|
||||
setDebugLocFromInst(Builder, &*it);
|
||||
/// Optimize the special case where the source is the induction
|
||||
/// variable. Notice that we can only optimize the 'trunc' case
|
||||
/// because: a. FP conversions lose precision, b. sext/zext may wrap,
|
||||
@ -3841,7 +3841,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
ConstantInt::getSigned(CI->getType(), II.getStepValue()->getSExtValue());
|
||||
for (unsigned Part = 0; Part < UF; ++Part)
|
||||
Entry[Part] = getStepVector(Broadcasted, VF * Part, Step);
|
||||
propagateMetadata(Entry, it);
|
||||
propagateMetadata(Entry, &*it);
|
||||
break;
|
||||
}
|
||||
/// Vectorize casts.
|
||||
@ -3851,7 +3851,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
VectorParts &A = getVectorValue(it->getOperand(0));
|
||||
for (unsigned Part = 0; Part < UF; ++Part)
|
||||
Entry[Part] = Builder.CreateCast(CI->getOpcode(), A[Part], DestTy);
|
||||
propagateMetadata(Entry, it);
|
||||
propagateMetadata(Entry, &*it);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3859,7 +3859,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
// Ignore dbg intrinsics.
|
||||
if (isa<DbgInfoIntrinsic>(it))
|
||||
break;
|
||||
setDebugLocFromInst(Builder, it);
|
||||
setDebugLocFromInst(Builder, &*it);
|
||||
|
||||
Module *M = BB->getParent()->getParent();
|
||||
CallInst *CI = cast<CallInst>(it);
|
||||
@ -3875,7 +3875,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
if (ID &&
|
||||
(ID == Intrinsic::assume || ID == Intrinsic::lifetime_end ||
|
||||
ID == Intrinsic::lifetime_start)) {
|
||||
scalarizeInstruction(it);
|
||||
scalarizeInstruction(&*it);
|
||||
break;
|
||||
}
|
||||
// The flag shows whether we use Intrinsic or a usual Call for vectorized
|
||||
@ -3886,7 +3886,7 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
bool UseVectorIntrinsic =
|
||||
ID && getVectorIntrinsicCost(CI, VF, *TTI, TLI) <= CallCost;
|
||||
if (!UseVectorIntrinsic && NeedToScalarize) {
|
||||
scalarizeInstruction(it);
|
||||
scalarizeInstruction(&*it);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3927,13 +3927,13 @@ void InnerLoopVectorizer::vectorizeBlockInLoop(BasicBlock *BB, PhiVector *PV) {
|
||||
Entry[Part] = Builder.CreateCall(VectorF, Args);
|
||||
}
|
||||
|
||||
propagateMetadata(Entry, it);
|
||||
propagateMetadata(Entry, &*it);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
// All other instructions are unsupported. Scalarize them.
|
||||
scalarizeInstruction(it);
|
||||
scalarizeInstruction(&*it);
|
||||
break;
|
||||
}// end of switch.
|
||||
}// end of for_each instr.
|
||||
@ -4201,7 +4201,7 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
if (!PhiTy->isIntegerTy() &&
|
||||
!PhiTy->isFloatingPointTy() &&
|
||||
!PhiTy->isPointerTy()) {
|
||||
emitAnalysis(VectorizationReport(it)
|
||||
emitAnalysis(VectorizationReport(&*it)
|
||||
<< "loop control flow is not understood by vectorizer");
|
||||
DEBUG(dbgs() << "LV: Found an non-int non-pointer PHI.\n");
|
||||
return false;
|
||||
@ -4213,9 +4213,9 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
if (*bb != Header) {
|
||||
// Check that this instruction has no outside users or is an
|
||||
// identified reduction value with an outside user.
|
||||
if (!hasOutsideLoopUser(TheLoop, it, AllowedExit))
|
||||
if (!hasOutsideLoopUser(TheLoop, &*it, AllowedExit))
|
||||
continue;
|
||||
emitAnalysis(VectorizationReport(it) <<
|
||||
emitAnalysis(VectorizationReport(&*it) <<
|
||||
"value could not be identified as "
|
||||
"an induction or reduction variable");
|
||||
return false;
|
||||
@ -4223,7 +4223,7 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
|
||||
// We only allow if-converted PHIs with exactly two incoming values.
|
||||
if (Phi->getNumIncomingValues() != 2) {
|
||||
emitAnalysis(VectorizationReport(it)
|
||||
emitAnalysis(VectorizationReport(&*it)
|
||||
<< "control flow not understood by vectorizer");
|
||||
DEBUG(dbgs() << "LV: Found an invalid PHI.\n");
|
||||
return false;
|
||||
@ -4255,8 +4255,8 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
|
||||
// Until we explicitly handle the case of an induction variable with
|
||||
// an outside loop user we have to give up vectorizing this loop.
|
||||
if (hasOutsideLoopUser(TheLoop, it, AllowedExit)) {
|
||||
emitAnalysis(VectorizationReport(it) <<
|
||||
if (hasOutsideLoopUser(TheLoop, &*it, AllowedExit)) {
|
||||
emitAnalysis(VectorizationReport(&*it) <<
|
||||
"use of induction value outside of the "
|
||||
"loop is not handled by vectorizer");
|
||||
return false;
|
||||
@ -4274,7 +4274,7 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
continue;
|
||||
}
|
||||
|
||||
emitAnalysis(VectorizationReport(it) <<
|
||||
emitAnalysis(VectorizationReport(&*it) <<
|
||||
"value that could not be identified as "
|
||||
"reduction is used outside the loop");
|
||||
DEBUG(dbgs() << "LV: Found an unidentified PHI."<< *Phi <<"\n");
|
||||
@ -4289,8 +4289,8 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
if (CI && !getIntrinsicIDForCall(CI, TLI) && !isa<DbgInfoIntrinsic>(CI) &&
|
||||
!(CI->getCalledFunction() && TLI &&
|
||||
TLI->isFunctionVectorizable(CI->getCalledFunction()->getName()))) {
|
||||
emitAnalysis(VectorizationReport(it) <<
|
||||
"call instruction cannot be vectorized");
|
||||
emitAnalysis(VectorizationReport(&*it)
|
||||
<< "call instruction cannot be vectorized");
|
||||
DEBUG(dbgs() << "LV: Found a non-intrinsic, non-libfunc callsite.\n");
|
||||
return false;
|
||||
}
|
||||
@ -4300,7 +4300,7 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
if (CI &&
|
||||
hasVectorInstrinsicScalarOpd(getIntrinsicIDForCall(CI, TLI), 1)) {
|
||||
if (!SE->isLoopInvariant(SE->getSCEV(CI->getOperand(1)), TheLoop)) {
|
||||
emitAnalysis(VectorizationReport(it)
|
||||
emitAnalysis(VectorizationReport(&*it)
|
||||
<< "intrinsic instruction cannot be vectorized");
|
||||
DEBUG(dbgs() << "LV: Found unvectorizable intrinsic " << *CI << "\n");
|
||||
return false;
|
||||
@ -4311,7 +4311,7 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
// Also, we can't vectorize extractelement instructions.
|
||||
if ((!VectorType::isValidElementType(it->getType()) &&
|
||||
!it->getType()->isVoidTy()) || isa<ExtractElementInst>(it)) {
|
||||
emitAnalysis(VectorizationReport(it)
|
||||
emitAnalysis(VectorizationReport(&*it)
|
||||
<< "instruction return type cannot be vectorized");
|
||||
DEBUG(dbgs() << "LV: Found unvectorizable type.\n");
|
||||
return false;
|
||||
@ -4335,8 +4335,8 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
||||
|
||||
// Reduction instructions are allowed to have exit users.
|
||||
// All other instructions must not have external users.
|
||||
if (hasOutsideLoopUser(TheLoop, it, AllowedExit)) {
|
||||
emitAnalysis(VectorizationReport(it) <<
|
||||
if (hasOutsideLoopUser(TheLoop, &*it, AllowedExit)) {
|
||||
emitAnalysis(VectorizationReport(&*it) <<
|
||||
"value cannot be used outside the loop");
|
||||
return false;
|
||||
}
|
||||
@ -4398,7 +4398,7 @@ void LoopVectorizationLegality::collectLoopUniforms() {
|
||||
BE = TheLoop->block_end(); B != BE; ++B)
|
||||
for (BasicBlock::iterator I = (*B)->begin(), IE = (*B)->end();
|
||||
I != IE; ++I)
|
||||
if (I->getType()->isPointerTy() && isConsecutivePtr(I))
|
||||
if (I->getType()->isPointerTy() && isConsecutivePtr(&*I))
|
||||
Worklist.insert(Worklist.end(), I->op_begin(), I->op_end());
|
||||
|
||||
while (!Worklist.empty()) {
|
||||
@ -4817,7 +4817,7 @@ unsigned LoopVectorizationCostModel::getWidestType() {
|
||||
Type *T = it->getType();
|
||||
|
||||
// Skip ignored values.
|
||||
if (ValuesToIgnore.count(it))
|
||||
if (ValuesToIgnore.count(&*it))
|
||||
continue;
|
||||
|
||||
// Only examine Loads, Stores and PHINodes.
|
||||
@ -4840,7 +4840,7 @@ unsigned LoopVectorizationCostModel::getWidestType() {
|
||||
// Ignore loaded pointer types and stored pointer types that are not
|
||||
// consecutive. However, we do want to take consecutive stores/loads of
|
||||
// pointer vectors into account.
|
||||
if (T->isPointerTy() && !isConsecutiveLoadOrStore(it))
|
||||
if (T->isPointerTy() && !isConsecutiveLoadOrStore(&*it))
|
||||
continue;
|
||||
|
||||
MaxWidth = std::max(MaxWidth,
|
||||
@ -5047,14 +5047,12 @@ LoopVectorizationCostModel::calculateRegisterUsage() {
|
||||
for (LoopBlocksDFS::RPOIterator bb = DFS.beginRPO(),
|
||||
be = DFS.endRPO(); bb != be; ++bb) {
|
||||
R.NumInstructions += (*bb)->size();
|
||||
for (BasicBlock::iterator it = (*bb)->begin(), e = (*bb)->end(); it != e;
|
||||
++it) {
|
||||
Instruction *I = it;
|
||||
IdxToInstr[Index++] = I;
|
||||
for (Instruction &I : **bb) {
|
||||
IdxToInstr[Index++] = &I;
|
||||
|
||||
// Save the end location of each USE.
|
||||
for (unsigned i = 0; i < I->getNumOperands(); ++i) {
|
||||
Value *U = I->getOperand(i);
|
||||
for (unsigned i = 0; i < I.getNumOperands(); ++i) {
|
||||
Value *U = I.getOperand(i);
|
||||
Instruction *Instr = dyn_cast<Instruction>(U);
|
||||
|
||||
// Ignore non-instruction values such as arguments, constants, etc.
|
||||
@ -5137,10 +5135,10 @@ unsigned LoopVectorizationCostModel::expectedCost(unsigned VF) {
|
||||
continue;
|
||||
|
||||
// Skip ignored values.
|
||||
if (ValuesToIgnore.count(it))
|
||||
if (ValuesToIgnore.count(&*it))
|
||||
continue;
|
||||
|
||||
unsigned C = getInstructionCost(it, VF);
|
||||
unsigned C = getInstructionCost(&*it, VF);
|
||||
|
||||
// Check if we should override the cost.
|
||||
if (ForceTargetInstructionCost.getNumOccurrences() > 0)
|
||||
|
@ -1742,7 +1742,8 @@ int BoUpSLP::getSpillCost() {
|
||||
}
|
||||
|
||||
// Now find the sequence of instructions between PrevInst and Inst.
|
||||
BasicBlock::reverse_iterator InstIt(Inst), PrevInstIt(PrevInst);
|
||||
BasicBlock::reverse_iterator InstIt(Inst->getIterator()),
|
||||
PrevInstIt(PrevInst->getIterator());
|
||||
--PrevInstIt;
|
||||
while (InstIt != PrevInstIt) {
|
||||
if (PrevInstIt == PrevInst->getParent()->rend()) {
|
||||
@ -2082,7 +2083,7 @@ void BoUpSLP::reorderInputsAccordingToOpcode(ArrayRef<Value *> VL,
|
||||
|
||||
void BoUpSLP::setInsertPointAfterBundle(ArrayRef<Value *> VL) {
|
||||
Instruction *VL0 = cast<Instruction>(VL[0]);
|
||||
BasicBlock::iterator NextInst = VL0;
|
||||
BasicBlock::iterator NextInst(VL0);
|
||||
++NextInst;
|
||||
Builder.SetInsertPoint(VL0->getParent(), NextInst);
|
||||
Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
|
||||
@ -2539,7 +2540,7 @@ Value *BoUpSLP::vectorizeTree() {
|
||||
scheduleBlock(BSIter.second.get());
|
||||
}
|
||||
|
||||
Builder.SetInsertPoint(F->getEntryBlock().begin());
|
||||
Builder.SetInsertPoint(&F->getEntryBlock().front());
|
||||
vectorizeTree(&VectorizableTree[0]);
|
||||
|
||||
DEBUG(dbgs() << "SLP: Extracting " << ExternalUses.size() << " values .\n");
|
||||
@ -2584,7 +2585,7 @@ Value *BoUpSLP::vectorizeTree() {
|
||||
User->replaceUsesOfWith(Scalar, Ex);
|
||||
}
|
||||
} else {
|
||||
Builder.SetInsertPoint(F->getEntryBlock().begin());
|
||||
Builder.SetInsertPoint(&F->getEntryBlock().front());
|
||||
Value *Ex = Builder.CreateExtractElement(Vec, Lane);
|
||||
CSEBlocks.insert(&F->getEntryBlock());
|
||||
User->replaceUsesOfWith(Scalar, Ex);
|
||||
@ -2693,7 +2694,7 @@ void BoUpSLP::optimizeGatherSequence() {
|
||||
BasicBlock *BB = (*I)->getBlock();
|
||||
// For all instructions in blocks containing gather sequences:
|
||||
for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e;) {
|
||||
Instruction *In = it++;
|
||||
Instruction *In = &*it++;
|
||||
if (!isa<InsertElementInst>(In) && !isa<ExtractElementInst>(In))
|
||||
continue;
|
||||
|
||||
@ -2852,7 +2853,7 @@ bool BoUpSLP::BlockScheduling::extendSchedulingRegion(Value *V) {
|
||||
}
|
||||
// Search up and down at the same time, because we don't know if the new
|
||||
// instruction is above or below the existing scheduling region.
|
||||
BasicBlock::reverse_iterator UpIter(ScheduleStart);
|
||||
BasicBlock::reverse_iterator UpIter(ScheduleStart->getIterator());
|
||||
BasicBlock::reverse_iterator UpperEnd = BB->rend();
|
||||
BasicBlock::iterator DownIter(ScheduleEnd);
|
||||
BasicBlock::iterator LowerEnd = BB->end();
|
||||
@ -3104,7 +3105,8 @@ void BoUpSLP::scheduleBlock(BlockScheduling *BS) {
|
||||
Instruction *pickedInst = BundleMember->Inst;
|
||||
if (LastScheduledInst->getNextNode() != pickedInst) {
|
||||
BS->BB->getInstList().remove(pickedInst);
|
||||
BS->BB->getInstList().insert(LastScheduledInst, pickedInst);
|
||||
BS->BB->getInstList().insert(LastScheduledInst->getIterator(),
|
||||
pickedInst);
|
||||
}
|
||||
LastScheduledInst = pickedInst;
|
||||
BundleMember = BundleMember->NextInBundle;
|
||||
@ -3508,7 +3510,7 @@ bool SLPVectorizer::tryToVectorizeList(ArrayRef<Value *> VL, BoUpSLP &R,
|
||||
unsigned VecIdx = 0;
|
||||
for (auto &V : BuildVectorSlice) {
|
||||
IRBuilder<true, NoFolder> Builder(
|
||||
++BasicBlock::iterator(InsertAfter));
|
||||
InsertAfter->getParent(), ++BasicBlock::iterator(InsertAfter));
|
||||
InsertElementInst *IE = cast<InsertElementInst>(V);
|
||||
Instruction *Extract = cast<Instruction>(Builder.CreateExtractElement(
|
||||
VectorizedRoot, Builder.getInt32(VecIdx++)));
|
||||
@ -3961,7 +3963,7 @@ bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
|
||||
|
||||
for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e; it++) {
|
||||
// We may go through BB multiple times so skip the one we have checked.
|
||||
if (!VisitedInstrs.insert(it).second)
|
||||
if (!VisitedInstrs.insert(&*it).second)
|
||||
continue;
|
||||
|
||||
if (isa<DbgInfoIntrinsic>(it))
|
||||
|
Loading…
Reference in New Issue
Block a user