[LLVMdev] How to write optimizer loop
Andrew Clinton
andrew at sidefx.com
Wed Mar 2 16:27:59 PST 2011
I've written an optimization loop, with the following form:
PassManager lpm;
lpm.add(createLoopDeletionPass());
lpm.add(createSCCPPass());
lpm.add(createAggressiveDCEPass());
lpm.add(createGlobalOptimizerPass());
lpm.add(createGlobalDCEPass());
lpm.add(createDeadStoreEliminationPass());
lpm.add(createLoopDeletionPass());
lpm.add(createInstructionCombiningPass());
lpm.add(createCFGSimplificationPass());
const int maxit = 100;
int it = 0;
bool changed = true;
while (changed && it < maxit)
{
changed = lpm.run(*myModule);
it++;
}
Aside from the possibility that the optimizations don't converge
(handled by the "maxit" variable), this code is erroneous since the Loop
Deletion pass incurs LCSSA and loop-simplify, which will likely always
modify code that has been simplified via CFGSimplification.
Is there a recommended method to write an optimization loop that
correctly detects when an iteration has made changes to the module? I'm
now thinking that it will be necessary to compare the new and previous
module, possibly with a hash function.
Also, how could I embed this loop into another PassManager so that it
doesn't need to recompute stuff such as DominatorTree?
Andrew
More information about the llvm-dev
mailing list