On Thu, Sep 13, 2012 at 3:11 PM, Eric Botcazou <ebotca...@adacore.com> wrote:
> Hi,
>
> the attached testcase triggers a memory exhaustion at -O2 during the cunrolli
> pass on the mainline and 4.7 branch.  The problem is that the size estimates
> disregard induction variable computations on the ground that they will be
> folded later.  But they aren't folded between the iterations of the loop so
> they can add up and exhaust the memory during SSA updating if stars are
> properly aligned.
>
> The patch is a somewhat simple-minded fix...  Bootstrapped/regtested on 
> x86_64-
> suse-linux.  OK for mainline and 4.7 branch?

Indeed somewhat simple-minded - when originally fixing a similar testcase
(heh ...) I improved things by improving CFG cleanup to fold some more
conditions by looking at SSA defs, that improved things a lot.  I also thought
the real fix should involve some scalar optimization on a sub-range of the CFG.
That should be easiest when performing the copy in the first place - after all
we keep copy tables and such for the purpose of update-SSA so we might as
well create a lattice from PHI nodes we disassemble for use by copy_bb ...

On the patch itself - can you call the simple CCP before we call
cleanup_tree_cfg () please?  We might get rid of that weirdo SSA lookup
there again then:

static bool
cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
{
...
            /* For conditions try harder and lookup single-argument
               PHI nodes.  Only do so from the same basic-block though
               as other basic-blocks may be dead already.  */
            if (TREE_CODE (lhs) == SSA_NAME
                && !name_registered_for_update_p (lhs))
...

+             FOR_EACH_IMM_USE_ON_STMT (use, iter)
+               propagate_value (use, gimple_assign_rhs1 (stmt));
+
+             fold_stmt_inplace (&use_stmt_gsi);
+             update_stmt (use_stmt);

Use SET_USE (use, rhs1) and cache gimple_assign_rhs1 somewhere.

  if (fold_stmt_inplace (&use_stmt_gsi))
    update_stmt (use_stmt);

Thanks,
Richard.

>
> 2012-09-13  Eric Botcazou  <ebotca...@adacore.com>
>
>         * tree-ssa-loop-ivcanon.c (propagate_constants_for_unrolling): New.
>         (tree_unroll_loops_completely): Starting from the second iteration,
>         propagate constants within the innermost loops.
>
>
> 2012-09-13  Eric Botcazou  <ebotca...@adacore.com>
>
>         * gnat.dg/loop_optimization12.ad[sb]: New test.
>
>
> --
> Eric Botcazou

Reply via email to