This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR55489, memory-hog bug in GCSE
- From: Paolo Bonzini <bonzini at gnu dot org>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 04 Dec 2012 23:53:42 +0100
- Subject: Re: [PATCH] Fix PR55489, memory-hog bug in GCSE
- References: <1354032011-32303-1-git-send-email-bonzini@gnu.org> <CAMe9rOrECCS9=bXojhyt6p4UTh8xjKJStiqdTeF=ny6x6d_tRw@mail.gmail.com>
Il 04/12/2012 23:30, H.J. Lu ha scritto:
> On Tue, Nov 27, 2012 at 8:00 AM, Paolo Bonzini <bonzini@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 <pbonzini@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