forked from OSchip/llvm-project
LoopVectorizer: Move cse code into its own function
llvm-svn: 193895
This commit is contained in:
parent
fedfa44922
commit
d0789cdffe
|
|
@ -2055,6 +2055,41 @@ Value *createMinMaxOp(IRBuilder<> &Builder,
|
||||||
return Select;
|
return Select;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///\brief Perform cse of induction variable instructions.
|
||||||
|
static void cse(BasicBlock *BB) {
|
||||||
|
// Perform simple cse.
|
||||||
|
SmallPtrSet<Instruction*, 16> Visited;
|
||||||
|
SmallVector<Instruction*, 16> ToRemove;
|
||||||
|
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
|
||||||
|
Instruction *In = I;
|
||||||
|
|
||||||
|
if (!isa<InsertElementInst>(In) && !isa<ExtractElementInst>(In) &&
|
||||||
|
!isa<ShuffleVectorInst>(In) && !isa<GetElementPtrInst>(In))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Check if we can replace this instruction with any of the
|
||||||
|
// visited instructions.
|
||||||
|
for (SmallPtrSet<Instruction*, 16>::iterator v = Visited.begin(),
|
||||||
|
ve = Visited.end(); v != ve; ++v) {
|
||||||
|
if (In->isIdenticalTo(*v)) {
|
||||||
|
In->replaceAllUsesWith(*v);
|
||||||
|
ToRemove.push_back(In);
|
||||||
|
In = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (In)
|
||||||
|
Visited.insert(In);
|
||||||
|
|
||||||
|
}
|
||||||
|
// Erase all of the instructions that we RAUWed.
|
||||||
|
for (SmallVectorImpl<Instruction *>::iterator v = ToRemove.begin(),
|
||||||
|
ve = ToRemove.end(); v != ve; ++v) {
|
||||||
|
assert((*v)->getNumUses() == 0 && "Can't remove instructions with uses");
|
||||||
|
(*v)->eraseFromParent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
InnerLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
|
InnerLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
|
||||||
//===------------------------------------------------===//
|
//===------------------------------------------------===//
|
||||||
|
|
@ -2275,38 +2310,8 @@ InnerLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
|
||||||
|
|
||||||
fixLCSSAPHIs();
|
fixLCSSAPHIs();
|
||||||
|
|
||||||
// Perform simple cse.
|
// Remove redundant induction instructions.
|
||||||
SmallPtrSet<Instruction*, 16> Visited;
|
cse(LoopVectorBody);
|
||||||
SmallVector<Instruction*, 16> ToRemove;
|
|
||||||
for (BasicBlock::iterator I = LoopVectorBody->begin(),
|
|
||||||
E = LoopVectorBody->end(); I != E; ++I) {
|
|
||||||
Instruction *In = I;
|
|
||||||
|
|
||||||
if (!isa<InsertElementInst>(In) && !isa<ExtractElementInst>(In) &&
|
|
||||||
!isa<ShuffleVectorInst>(In) && !isa<GetElementPtrInst>(In))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Check if we can replace this instruction with any of the
|
|
||||||
// visited instructions.
|
|
||||||
for (SmallPtrSet<Instruction*, 16>::iterator v = Visited.begin(),
|
|
||||||
ve = Visited.end(); v != ve; ++v) {
|
|
||||||
if (In->isIdenticalTo(*v)) {
|
|
||||||
In->replaceAllUsesWith(*v);
|
|
||||||
ToRemove.push_back(In);
|
|
||||||
In = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (In)
|
|
||||||
Visited.insert(In);
|
|
||||||
|
|
||||||
}
|
|
||||||
// Erase all of the instructions that we RAUWed.
|
|
||||||
for (SmallVectorImpl<Instruction *>::iterator v = ToRemove.begin(),
|
|
||||||
ve = ToRemove.end(); v != ve; ++v) {
|
|
||||||
assert((*v)->getNumUses() == 0 && "Can't remove instructions with uses");
|
|
||||||
(*v)->eraseFromParent();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InnerLoopVectorizer::fixLCSSAPHIs() {
|
void InnerLoopVectorizer::fixLCSSAPHIs() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue