On Fri, Jan 15, 2016 at 06:24:42AM -0800, H.J. Lu wrote: > >> -Ofast -mavx -mno-avx2 -mtune=bdver2 > >> > >> float *a, *b; > >> int c, d, e, f; > >> void > >> foo (void) > >> { > >> for (; c; c++) > >> a[c] = 0; > >> if (!d) > >> for (; c < f; c++) > >> b[c] = (double) e / b[c]; > >> } > >> > >> r232086 vs. r232088 gives. I don't see significant differences before IRA, > >> IRA seems to have some cost differences (strange), but the same > >> dispositions, > >> and LRA ends up with all the differences. > >> > > > > That may be due to the difference between define_memory_constraint and > > define_constraint. LRA doesn't consider register for define_constraint if > > memory is true. > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68991#c14
Tracking this in PR69299. Maybe we really need to have two types of memory constraints, ones which can be worst case always satisfied by reloading their address into an address register and another ones which can be worst case always satisfied by loading the memory into a temporary register (for loads) or storing it from a temporary register. Jakub