On Sat, Mar 9, 2013 at 11:23 PM, Steven Bosscher <stevenb....@gmail.com> wrote: > Hello, > > The attached patch fixes one of the (at least) three scalability > problems reported in PR middle-end/39326. This problem is that combine > takes forever and increases the memory footprint from ~650MB to >7GB. > The cause is DSE creating a lot of new registers in replace_read, and > those registers are not copy-prop'd out between dse1 and combine. The > result is many overlapping live ranges and single-set-single-use > registers that combine is made to work on. > > The fix is to just not create so many new registers in DSE in the > first place. It is wasteful and unnecessary if an existing register > can be re-used. > > With this patch, for the test case of the PR the combine time in > combine goes down from ~350s to ~4.5s, and the memory footprint > explosion is avoided. For my set of cc1-i files this also helps reduce > compile time a modest amount, especially for the larger files of > course. > > Bootstrapped&tested on {x86_64,powerpc64}-unknown-linux-gnu. > OK for trunk?
Not sure on the patch details - but in general I wonder why _DSE_ performs full redundancy elimination at all ... which replace_read seems to be. Anyway, for this one I'd say we wait for stage1 and consider backporting for 4.8.1 given we want to do a 4.8 RC1 soon. Thanks, Richard. > Ciao! > Steven > > > PR middle-end/39326 > * dse.c (replace_read): If the stored value is a pseudo-register > that is set only once, re-use it to replace the load instead of > creating a new register.