On Thu, Sep 13, 2012 at 4:00 PM, Eric Botcazou <[email protected]> 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