In addition to TreeOptimizers, GCC also performs various optimizations on its internal RTL representation.
Passes and their technology (incomplete, feed me):
- if-conversion ([gccsource:ifcvt.c]): Runs before and after reload, does not work in cfglayout mode,
- does not use [gccsource:df.c].
- PRE, CPROP, hoisting ([gccsource:gcse.c]): Does not use cfglayout mode or [gccsource:df.c].
CSE: it is a mess. In 4.2 we should be able to [make it work on EBBs||Replacements for CSE path following], but 6000 lines of code will remain there! It has many ad hoc loops that look for special cases and are probably not useful anymore (because of tree optimization, or using [gccsource:simplify-rtx.c]).
Todo:
RTL_hooks: there are lots of places where different passes do slightly
- different things,
- CSE and GCSE have some functions in common (e.g. exp_equiv_p).
- A lot of nice simplifications in combine could be made generic by
- hookizing expand_compound_operation and make_compound_operation.
- There are some more simplifications that can be moved from combine
- to [gccsource:simplify-rtx.c]
- Many pattern matching loops in CSE could be replaced by assigning nonzero_bits values to each reg_qty.
- Could be worth creating a one_bits hook (similar to nonzero_bits, and useful for additional simplifications).
Better handling of the [control flow graph||basic block graph].