https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101991
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Last reconfirmed| |2021-08-20
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
<bb 3> [local count: 955630225]:
# r_11 = PHI <r_8(6), d_3(D)(5)>
r_8 = e_7(D) & r_11;
I wonder if this is sth for phiopt to pattern match. In principle VN
would need to figure (for PRE) that the PHI translated d_3(D) & e_7(D)
is equal to r_8. So the "trick" (aka pattern-matching) could be done
during phi_translation.
But then both look like a hack. Curiously when we do
int f(int t, int d, int e)
{
int r = d & e;
for(int i = 0; i < t; i++)
r &= e;
return r;
}
aka "peel" one iteration, then CCP is what eliminates the in-loop AND.
Ah, that's because we simplify d & e & e since we optimistically start
with just the entry edge value. And that remains so. With PRE
we're not fully re-doing VN of PHIs but phi-translation seeks to
re-use existing value-numbers where possible, so a programmatic approach
doesn't work here.