http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47477
--- Comment #6 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-01-28 11:04:19 UTC --- (In reply to comment #4) > Alternatively, this narrowing of > word mode operations could as well be done > during tree optimizations. I think the FE is the only place which performs > them, > as can be seen if you modify your testcase to do: > void * > add (void *a, void *b) > { > return (void *)(__INTPTR_TYPE__) ((long long)(__INTPTR_TYPE__) a + ((long > long)(__INTPTR_TYPE__) b & ~1L)); > } > instead of > void * > add (void *a, void *b) > { > long long tmp = (long long)(__INTPTR_TYPE__) a + ((long > long)(__INTPTR_TYPE__) b & ~1L); > return (void *)(__INTPTR_TYPE__) tmp; > } > > But unfortunately we have nothing which performs this later on (gimple-fold?). As it needs to combine several statements tree forwprop is our current place to deal with this (as our "tree combiner"). Similar to the new associate_plusminus code we should have combiners (not re-using fold) to combine conversions.