On Tue, 20 Feb 2007, Dan Sheridan wrote:
>
> So it thinks that both x and y are in %r2. However, if y is initialised,
> the assignment happens as expected.
>
> Any ideas?
Heh. I think you found a nasty nasty bug.
I didn't look very closely, but using "-vv" shows the loads of 'y' have
been turned into lnop's, which means that the dominance analysis decided
that it could just replace all uses of 'y' with the (single) assignment to
it. Basically, it decides that the
y = x;
assignment always dominates the use ("return x-y"), so it will happily
have turned it into "return x-x" (and then it *should* have simplified
that, but didn't - it's not a simplification pattern I ever added).
Looks like some totally nasty, and probably very fundamental dominance
analysis bug. I *suspect* that what happens is simply that we create a
phi-node for the load (rewrite_load_instruction), but then since there is
only a single phi source associated with it, we simplify it to just use
the pseudo directly.
Which is why adding the initialization hides the bug: suddenly there is
more than one dominator, and the bogus optimization goes away.
(It's possible that the optimization happened even before the PHI node was
even created: we have several layers of this, and I think you may even be
hitting the "we have a single def for this variable, so replace all loads
with that def even without doing any dominance analysis AT ALL" case)
I'll try to look at it, but I may not have the time. It looks like a
fairly fundamental thinko, though.
Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html