As an example, combine pass is based on outdated work of Fraser,
Proebsting etc.
And combine is useful for ia64 because...? Alternatives for combine
exist for targets with relatively simple ISAs with few parallels.
While it is true that combine is not a very good algorithm, combine is
not really instruction selection (which is done at best in regclass
through global, and at worst in or after reload). It started as a
simplification engine with a pinch of instruction selection and another
pinch of jump threading.
With RTL you cannot do BURG/IBURG instruction selection easily, but you
can do what combine does now: for example with dynamic programming you
get optimal results.
I think fwprop is not directly related since it is doing addressing mode
selection, and it simplifies complex expressions only if they result in
constants. Also, fwprop is (quasi) global while combine's job can be
done in basic blocks (not even EBBs).
OTOH, if you just mentioned fwprop as an example of how you can write a
decently readable RTL pass, I'm happy about that. ;-)
Paolo