Date: Fri, 1 Jun 2001 16:38:17 -0500 (CDT) From: Chris Lattner To: Vikram S. Adve Subject: Interesting: GCC passes Take a look at this document (which describes the order of optimizations that GCC performs): http://gcc.gnu.org/onlinedocs/gcc_17.html The rundown is that after RTL generation, the following happens: 1 . [t] jump optimization (jumps to jumps, etc) 2 . [t] Delete unreachable code 3 . Compute live ranges for CSE 4 . [t] Jump threading (jumps to jumps with identical or inverse conditions) 5 . [t] CSE 6 . *** Conversion to SSA 7 . [t] SSA Based DCE 8 . *** Conversion to LLVM 9 . UnSSA 10. GCSE 11. LICM 12. Strength Reduction 13. Loop unrolling 14. [t] CSE 15. [t] DCE 16. Instruction combination, register movement, scheduling... etc. I've marked optimizations with a [t] to indicate things that I believe to be relatively trivial to implement in LLVM itself. The time consuming things to reimplement would be SSA based PRE, Strength reduction & loop unrolling... these would be the major things we would miss out on if we did LLVM creation from tree code [inlining and other high level optimizations are done on the tree representation]. Given the lack of "strong" optimizations that would take a long time to reimplement, I am leaning a bit more towards creating LLVM from the tree code. Especially given that SGI has GPL'd their compiler, including many SSA based optimizations that could be adapted (besides the fact that their code looks MUCH nicer than GCC :) Even if we choose to do LLVM code emission from RTL, we will almost certainly want to move LLVM emission from step 8 down until at least CSE has been rerun... which causes me to wonder if the SSA generation code will still work (due to global variable dependencies and stuff). I assume that it can be made to work, but might be a little more involved than we would like. I'm continuing to look at the Tree -> RTL code. It is pretty gross because they do some of the translation a statement at a time, and some of it a function at a time... I'm not quite clear why and how the distinction is drawn, but it does not appear that there is a wonderful place to attach extra info. Anyways, I'm proceeding with the RTL -> LLVM conversion phase for now. We can talk about this more on Monday. Wouldn't it be nice if there were a obvious decision to be made? :) -Chris