[PATCH] Fix various reassoc issues (PR tree-optimization/58791, tree-optimization/58775)
Jeff Law
law@redhat.com
Wed Oct 23 17:22:00 GMT 2013
On 10/23/13 04:35, Jakub Jelinek wrote:
> For debug info quality it actually isn't just about using different
> SSA_NAME, but also not reusing the defining stmt; only then the code
> will magically try to create debug temporaries and expressions from the old
> dead defining stmt.
Joys. Something else to remember.
>
>>> -/* Returns the UID of STMT if it is non-NULL. Otherwise return 1. */
>>> +/* Returns true if statement S1 dominates statement S2. Like
>>> + stmt_dominates_stmt_p, but uses stmt UIDs to optimize. */
>>>
>>> -static inline unsigned
>>> -get_stmt_uid_with_default (gimple stmt)
>>> +static bool
>>> +reassoc_stmt_dominates_stmt_p (gimple s1, gimple s2)
>>> +{
>>> + basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
>>> +
>>> + if (!bb1 || s1 == s2)
>>> + return true;
>>> +
>>> + if (!bb2)
>>> + return false;
>> Maybe this was carried over from somewhere else, but that looks
>> awful strange. When !bb1 you return true, but if !bb2 you return
>> false. At the least it deserves a comment.
>
> bb{1,2} == NULL means a default definition of the corresponding lhs.
Ahh, it makes much more sense now.
ISTM that should be documented in the function header and in
stmt_dominates_stmt_p in. Yes, I know you're not responsible for this
mess, but better to get it cleaned up now since you're in there.
Obviously no need for a re-bootstrap to add that comment fix.
>
>>> + if (gimple_uid (s1) < gimple_uid (s2))
>>> + return true;
>>> +
>>> + if (gimple_uid (s1) > gimple_uid (s2))
>>> + return false;
>> So if one (but not both) of the UIDs isn't set yet, one of these two
>> statements will return, which seems wrong since we don't know where
>> the statement without a UID is relative to the statement with a UID.
>> Am I missing something?
>
> Right now we shouldn't see an unset uid here at all, unless it is a PHI,
> which is handled earlier. break_up_subtract_bb initializes them for
> all preexisting stmts, and the various places which add new stmts are
> responsible for setting uid to either the uid of the immediately preceeding
> or following stmt that has uid set (or 1 if the bb was previously empty).
OK. Might be worth a comment as well -- something as simple as only
PHIs have unset UIDs here. Once that precondition is known the code is
pretty easy to understand.
>
>>> + gimple_stmt_iterator gsi = gsi_for_stmt (s1);
>>> + unsigned int uid = gimple_uid (s1);
>>> + for (gsi_next (&gsi); !gsi_end_p (gsi); gsi_next (&gsi))
>>> + {
>>> + gimple s = gsi_stmt (gsi);
>>> + if (gimple_uid (s) != uid)
>>> + break;
>>> + if (s == s2)
>>> + return true;
>>> + }
>> Don't we only get here if both UIDs are zero (or the same by other
>> means)? If so does this code even make sense?
>
> Both UIDs zero should not happen, both UIDs the same can happen, we don't
> renumber the whole bb upon inserting something into the bb.
Ok.
>
> Note the above isn't in any way a new code, just a cleanup of the
> preexisting, just earlier the thing was done in more than one place
> and could mishandle the uid setting.
I understand that. But I can easily see that the function is either
mis-named, poorly documented, or utter crap. The question is which is
it :-)
>
> Anyway, from my understanding, insert_point is always a SSA_NAME setter
So let's get that documented. Again, once the precondition is
understood, the code makes more sense.
At this point my only concerns are getting those functions documented a
bit better -- which you can do as a pre-approved followup.
Being away from GCC for a long time has actually been good in some ways
in that I don't have experience with much of the new bits. Thus I rely
a lot more on comments, function/variable names, etc to provide some of
the context.
Jeff
More information about the Gcc-patches
mailing list