[PATCH] Fix RTL DSE compile time hog (PR rtl-optimization/48141)
Kenneth Zadeck
zadeck@naturalbridge.com
Tue Mar 15 23:12:00 GMT 2011
so how much time does this save?
I agree that this is a useful simplification, but it seems unlikely to
be that important in real code.
it seems like the 5000 store test would in general provide a better
safety valve.
Kenny
On 03/15/2011 07:05 PM, Jakub Jelinek wrote:
> Hi!
>
> On the attached testcase we spend> 7 minutes in RTL DSE, as we end up
> with active_local_stores chain with up to 100000 entries and we walk
> it through on each store.
>
> The following patch fixes it by throwing away from active_local_stores
> list stores that don't have any positions needed, but can't be deleted
> (I believe such stores aren't helpful at all in the list, we aren't going
> to remove them anyway, and they can't be used by replace_read either).
> Alternatively (or in addition to this) we might remember the length of the
> active_local_stores list and just drop it on the floor when it becomes
> too long (say over 5000 stores or something similar, perhaps a param).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk (and
> after a while for 4.6)?
>
> 2011-03-15 Jakub Jelinek<jakub@redhat.com>
>
> PR rtl-optimization/48141
> * dse.c (record_store): If no positions are needed in an insn
> that cannot be deleted, at least unchain it from active_local_stores.
>
> * gcc.dg/pr48141.c: New test.
>
> --- gcc/dse.c.jj 2011-02-15 15:42:26.000000000 +0100
> +++ gcc/dse.c 2011-03-15 21:25:59.000000000 +0100
> @@ -1530,8 +1530,7 @@ record_store (rtx body, bb_info_t bb_inf
>
> /* An insn can be deleted if every position of every one of
> its s_infos is zero. */
> - if (any_positions_needed_p (s_info)
> - || ptr->cannot_delete)
> + if (any_positions_needed_p (s_info))
> del = false;
>
> if (del)
> @@ -1543,7 +1542,8 @@ record_store (rtx body, bb_info_t bb_inf
> else
> active_local_stores = ptr->next_local_store;
>
> - delete_dead_store_insn (insn_to_delete);
> + if (!insn_to_delete->cannot_delete)
> + delete_dead_store_insn (insn_to_delete);
> }
> else
> last = ptr;
> --- gcc/testsuite/gcc.dg/pr48141.c.jj 2011-03-15 21:48:46.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr48141.c 2011-03-15 21:48:27.000000000 +0100
> @@ -0,0 +1,17 @@
> +/* PR rtl-optimization/48141 */
> +/* { dg-do compile } */
> +/* { dg-options "-O" } */
> +
> +#define A i = 0;
> +#define B A A A A A A A A A A
> +#define C B B B B B B B B B B
> +#define D C C C C C C C C C C
> +#define E D D D D D D D D D D
> +
> +int
> +foo (void)
> +{
> + volatile int i = 0;
> + E E E E E E E E E E E
> + return 0;
> +}
>
> Jakub
More information about the Gcc-patches
mailing list