On Thu, Sep 13, 2012 at 4:00 PM, Eric Botcazou <ebotca...@adacore.com> wrote:
>> 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 ...
>
> I also thought of similar approaches, but couldn't really come up with
> something satisfactory.
>
>> On the patch itself - can you call the simple CCP before we call
>> cleanup_tree_cfg () please?
>
> That was the original implementation (in fact, in the original implementation
> the simple CCP was conditionalized on canonicalize_loop_induction_variables,
> but you broke it a few days ago by moving the call to update_ssa :-)
>
> The problem is that, if it is moved to before cleanup_tree_cfg, then:
>  1) you have more basic blocks (15 vs 2 for the testcase),
>  2) you also need to do simple CCP for degenerate PHI nodes.

Yes - now cfg_cleanup does that (and it really shouldn't be its job).  That
was the improvement I talked about - reducing the number of BBs a lot.

> That being said, I can certainly save in a bitmap the loop fathers for which
> canonicalize_loop_induction_variables unrolled a child and do the simple CPP
> (augmented for degenerate PHI nodes) on them between the calls to update_ssa
> and cleanup_tree_cfg.

Ah, indeed ;)  Or just push struct loop of changed loops onto a stack.

>> 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))
>
> I'll investigate.
>
>> +             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);
>
> OK, will adjust, thanks.

Thanks,
Richard.

> --
> Eric Botcazou

Reply via email to