https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88936
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
OK, so the issue is that the clobber of rD.1909 makes *v_8(D) = 0 dead
because IPA points-to uses the callers r UID in the points-to set on
the receiving side as well.
bug (long intD.8 depthD.1905, long intD.8 * vD.1906)
{
# RANGE [-9223372036854775808, 9223372036854775806]
long intD.8 depth_6(D) = depthD.1905;
# PT = null { D.1909 }
# ALIGN = 8, MISALIGN = 0
long intD.8 * v_8(D) = vD.1906;
long intD.8 valD.1910;
...
<bb 2> [local count: 1073741824]:
if (depth_6(D) == 0)
goto <bb 3>; [51.12%]
else
goto <bb 4>; [48.88%]
<bb 3> [local count: 548896821]:
*v_8(D) = 0;
goto <bb 5>; [100.00%]
...
<bb 5> [local count: 1073741824]:
# _4 = PHI <1(3), _13(4)>
rD.1909 ={v} {CLOBBER};
return _4;
}
I don't see an easy way to mitigate this (this can also happen in arbitrary
cycles). We have to support the case where exactly this UID needs to be
present (if a pointer to r is returned again) as well as the case of
supporting alternate instantiations of r. One way would be to always
pass down another dummy var (but we'd need a UID for that). There's
also the missed optimization that bug() doesn't know v does not point
to its local r in IPA-PTA (I think).
Cycles are difficult.
A simple approach might be to drop to non-IPA mode for members of a
cgraph cycle. Do we have an utility to compute SCCs of the callgraph?