mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-26 20:57:15 +00:00
add a top-level iteration loop to instcombine. This means that it will never
finish without combining something it is capable of. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34865 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
af3e9468dc
commit
ec9c35826d
@ -141,6 +141,8 @@ namespace {
|
||||
|
||||
public:
|
||||
virtual bool runOnFunction(Function &F);
|
||||
|
||||
bool DoOneIteration(Function &F, unsigned ItNum);
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<TargetData>();
|
||||
@ -9164,9 +9166,12 @@ static void AddReachableCodeToWorklist(BasicBlock *BB,
|
||||
AddReachableCodeToWorklist(TI->getSuccessor(i), Visited, IC, TD);
|
||||
}
|
||||
|
||||
bool InstCombiner::runOnFunction(Function &F) {
|
||||
bool InstCombiner::DoOneIteration(Function &F, unsigned Iteration) {
|
||||
bool Changed = false;
|
||||
TD = &getAnalysis<TargetData>();
|
||||
|
||||
DEBUG(DOUT << "\n\nINSTCOMBINE ITERATION #" << Iteration << " on "
|
||||
<< F.getNameStr() << "\n");
|
||||
|
||||
{
|
||||
// Do a depth-first traversal of the function, populate the worklist with
|
||||
@ -9295,24 +9300,36 @@ bool InstCombiner::runOnFunction(Function &F) {
|
||||
if (isInstructionTriviallyDead(I)) {
|
||||
// Make sure we process all operands now that we are reducing their
|
||||
// use counts.
|
||||
AddUsesToWorkList(*I);;
|
||||
AddUsesToWorkList(*I);
|
||||
|
||||
// Instructions may end up in the worklist more than once. Erase all
|
||||
// occurrences of this instruction.
|
||||
RemoveFromWorkList(I);
|
||||
I->eraseFromParent();
|
||||
} else {
|
||||
AddToWorkList(Result);
|
||||
AddUsersToWorkList(*Result);
|
||||
AddToWorkList(I);
|
||||
AddUsersToWorkList(*I);
|
||||
}
|
||||
}
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
assert(WorklistMap.empty() && "Worklist empty, but map not?");
|
||||
return Changed;
|
||||
}
|
||||
|
||||
|
||||
bool InstCombiner::runOnFunction(Function &F) {
|
||||
bool EverMadeChange = false;
|
||||
|
||||
// Iterate while there is work to do.
|
||||
unsigned Iteration = 0;
|
||||
while (DoOneIteration(F, Iteration++))
|
||||
EverMadeChange = true;
|
||||
return EverMadeChange;
|
||||
}
|
||||
|
||||
FunctionPass *llvm::createInstructionCombiningPass() {
|
||||
return new InstCombiner();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user