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?