[PATCH GCC]Fix pr60363 by adding backtraced value of phi arg along jump threading path
Jeff Law
law@redhat.com
Thu Apr 24 20:58:00 GMT 2014
On 04/17/14 04:07, Bin.Cheng wrote:
> On Thu, Apr 17, 2014 at 1:30 PM, Jeff Law <law@redhat.com> wrote:
>> On 03/18/14 04:13, bin.cheng wrote:
>>>
>>> Hi,
>>> After control flow graph change made by
>>> http://gcc.gnu.org/ml/gcc-patches/2014-02/msg01492.html, case
>>> gcc.dg/tree-ssa/ssa-dom-thread-4.c is broken on logical_op_short_circuit
>>> targets including cortex-m3/cortex-m0.
>>> The regression reveals a missed opportunity in jump threading, which
>>> causes
>>> a forward basic block doesn't get removed in cfgcleanup after jump
>>> threading
>>> in VRP1. Root cause is stated at the corresponding PR:
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60363, please refer to it for
>>> detailed report.
>>>
>>> This patch fixes the issue by adding constant value instead of ssa_name as
>>> the new phi argument. Bootstrap and test on x86_64, also test on
>>> cortex-m3
>>> and the regression is gone.
>>> I think this should wait for stage1, but would like to hear some comments
>>> now. So does it look reasonable?
>>>
>>>
>>> 2014-03-18 Bin Cheng<bin.cheng@arm.com>
>>>
>>> PR regression/60363
>>> * gcc/tree-ssa-threadupdate.c (get_value_locus_in_path): New.
>>> (copy_phi_args): New parameters. Call get_value_locus_in_path.
>>> (update_destination_phis): New parameter.
>>> (create_edge_and_update_destination_phis): Ditto.
>>> (ssa_fix_duplicate_block_edges): Pass new arguments.
>>> (thread_single_edge): Ditto.
>>
>> This is a good and interesting catch. DOM knows how to propagate these
>> context sensitive equivalences which should expose the optimizable forwarder
>> blocks.
> At the time I was looking into the problem, DOM couldn't understand
> the equivalence. Maybe it can be improved too.
That's something I improved during 4.9 stage1 development. There were
cases where we clearly missed propagating a context sensitive
equivalence into PHI nodes. I didn't check this specific case, but it
looks reasonably similar to the cases I fixed a few months back.
>>> + for (int j = idx - 1; j >= 0; j--)
>>> + {
>>> + edge e = (*path)[j]->e;
>>> + if (e->dest == def_bb)
>>> + {
>>> + arg = gimple_phi_arg_def (def_phi, e->dest_idx);
>>> + *locus = gimple_phi_arg_location (def_phi, e->dest_idx);
>>> + return (TREE_CODE (arg) == INTEGER_CST ? arg : def);
>>
>> Presumably any constant that can legitimately appear in a PHI node is good
>> here. So for example ADDR_EXPR <something in static storage> ought to be
>> handled as well.
>>
>> One could also argue that we should go ahead and do a context sensitive copy
>> propagation here too if ARG turns out to be an SSA_NAME. You have to be a
>> bit more careful with those and use may_propagate_copy_p and you'd probably
>> want to test the loop depth of the SSA_NAMEs to ensure you're not doing a
>> propagation that is going to muck up LICM. See loop_depth_of_name uses in
>> tree-ssa-dom.c.
>>
>> Overall I think it's good. We just need to resolve whether or not we want
>> to catch constant ADDR_EXPRs and/or do the context sensitive copy
>> propagations.
> Do you mean const/copy propagation in jump threading optimization, or
> just an independent opt somewhere else? It's naturally flow sensitive
> along jump threading path, which looks interesting to me.
Thinking more about it, I'd probably hold off on the context sensitive
copy propagation right now since you have to check a variety of things
to ensure correctness and performance. Handling that as a follow-up
would make sense if you're interested.
So for this patch to go forward, all I think you need to do is change
the test TREE_CODE (arg) == INTEGER_CST above to instead test
is_gimple_min_invariant (arg), bootstrap & test. Assuming the bootstrap
and regressino test pass with that change, consider the patch pre-approved.
jeff
More information about the Gcc-patches
mailing list