http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55721
--- Comment #8 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 2013-01-09 20:32:25 UTC --- Created attachment 29132 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29132 prototype patch Here's the current version of patch in case anyone wants to give it a try. It feels a bit overengineered considering that in practice I think we really do just care about (SYMBOL_64_HIGH << 32) + SYMBOL_64_LOW (i.e. the result of the superscalar lea optimisation). Everything else should still be a recognisable (lo_sum (foo (high X)) X), where (foo ...) represents optional indexing. Recognising the HIGH part sometimes relies on a (high X) REG_EQUAL note, but that's OK. The patch seems to cope with things like: extern int x[]; void bar (int *); void f1 (long y) { bar (&x[y + 3]); }