Il 04/12/2012 23:30, H.J. Lu ha scritto: > On Tue, Nov 27, 2012 at 8:00 AM, Paolo Bonzini <bonz...@gnu.org> wrote: >> Hi, >> >> this bug triggers in the compilation of QEMU with GCC 4.7.2. It is >> latent on trunk because reg_known_value is completely broken. I'll >> send a separate patch, but this one applies there too. >> >> The problem arises when you have -fPIE (or -fPIC) and a huge function >> with a lot of references to global variables. Canonicalization of >> position-independent addresses is then done over and over for the >> same addresses, resulting in quadratic time and memory complexity for >> GCSE's compute_transp; hundreds of megabytes of memory are allocated >> in plus_constant, >> >> The fix is to canonicalize the addresses outside the loop, similar to >> what is done by the RTL DSE pass. >> >> gcc 4.4.6: >> PRE : 3.83 (24%) usr 0.15 (17%) sys 3.99 (24%) wall 267307 kB (33%) >> ggc >> >> gcc 4.7.2: >> PRE : 7.95 (41%) usr 0.40 (40%) sys 8.31 (41%) wall 821017 kB (80%) >> ggc >> >> gcc 4.8.0: >> PRE : 6.94 (26%) usr 0.02 ( 4%) sys 6.98 (26%) wall 731 kB ( 0%) >> ggc >> >> gcc 4.7.2 + patch: >> PRE : 5.90 (34%) usr 0.02 ( 3%) sys 6.41 (35%) wall 1670 kB ( 1%) >> ggc >> >> Note that the bug is present on older branches too, but it became much >> worse sometime between 4.4 and 4.7. >> >> Bootstrap finished on x86_64-pc-linux-gnu, regtest in progress; ok for >> 4.7 and trunk if it passes? >> >> Paolo >> >> 2012-11-26 Paolo Bonzini <pbonz...@redhat.com> >> >> PR rtl-optimization/55489 >> * gcse.c (compute_transp): Precompute a canonical version >> of XEXP (x, 0), and pass it to canon_true_dependence. >> > > This caused: > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55597
Most likely caused by http://gcc.gnu.org/ml/gcc-patches/2012-11/msg02225.html ([PATCH] Fix allocation of reg_known_value), not by this patch. Paolo