| Date: Fri, 1 Jun 2001 16:38:17 -0500 (CDT) | 
 | From: Chris Lattner <sabre@nondot.org> | 
 | To: Vikram S. Adve <vadve@cs.uiuc.edu> | 
 | 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 | 
 |  |