https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103117
Bug ID: 103117 Summary: uncprop produces harder to analyze but not better code Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hubicka at gcc dot gnu.org Target Milestone: --- For the following struct a {int v; struct a *next;}; struct a* next(struct a *a) { if (!a || a->v) return 0; return a->next; } (we have quite few functions like this in gcc sources) We produce struct a * next (struct a * a) { int _1; struct a * _2; struct a * _5; <bb 2> [local count: 1073741824]: if (a_3(D) == 0B) goto <bb 6>; [8.27%] else goto <bb 3>; [91.73%] <bb 6> [local count: 88798448]: goto <bb 5>; [100.00%] <bb 3> [local count: 984943377]: _1 = a_3(D)->v; if (_1 != 0) goto <bb 7>; [17.38%] else goto <bb 4>; [82.62%] <bb 7> [local count: 171183158]: goto <bb 5>; [100.00%] <bb 4> [local count: 813760219]: _5 = a_3(D)->next; <bb 5> [local count: 1073741824]: # _2 = PHI <0B(7), _5(4), 0B(6)> return _2; } while uncprop concludes it is a good idea to turn 0 in the last PHI to a: # _2 = PHI <0B(7), _5(4), a_3(D)(6)> this confuses e.g. modref that thinks that a may be returned directly because it does not understand that the a_3 argument of PHI is funny way to express constant 0. I do not think the uncprop change helps anything - the PHI still has 0 argument in the other arm. The modref confussion can be solved by moving it before uncprop, but I wonder if we want to do the transform after all.