https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111009
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
CC| |amacleod at redhat dot com,
| |rguenth at gcc dot gnu.org
Priority|P3 |P2
Target Milestone|--- |12.4
Last reconfirmed| |2023-08-14
Ever confirmed|0 |1
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
There's nothing really wrong with lifting the &dso->maj computation, on GIMPLE
&dso->maj is just address arithmetic.
Interestingly we unswitch the loop but only with -fwrapv-pointer.
OK, so the bug looks like we have
if (&dso->maj != 0)
for (;;)
{
if (!dso) return 1;
if (dso == curr) return 1;
...
}
and the if (!dso) test is optimized away since &dso->maj != 0.
That's done by DOM3 here:
Optimizing statement _21 = dso_8(D) == _11;
LKUP STMT _21 = dso_8(D) eq_expr _11
2>>> STMT _21 = dso_8(D) eq_expr _11
Optimizing statement _22 = _21 | _13;
Replaced '_13' with constant '0'
Applying pattern match.pd:201, gimple-match-10.cc:6318
gimple_simplified to _22 = _21;
Folded to: _22 = _21;
I don't see where _13 = 0 is entered, this is possibly ranger related:
_13 : CACHE: BB 9 DOM query for _13, found [irange] _Bool VARYING at BB3
797 GORI recomputation attempt on edge 3->16 for _13 = dso_8(D) == 0B;
798 GORI outgoing_edge for dso_8(D) on edge 3->16
799 GORI compute op 1 (a_9) at if (a_9 == 0B)
GORI LHS =[irange] _Bool [1, 1]
GORI Computes a_9 = [irange] int * [0, 0] intersect Known range
: [irange] int * VARYING
GORI TRUE : (799) produces (a_9) [irange] int * [0, 0]
800 GORI compute op 1 (dso_8(D)) at a_9 = &dso_8(D)->maj;
GORI LHS =[irange] int * [0, 0]
GORI Computes dso_8(D) = [irange] struct dso * [0, 0] intersect
Known range : [irange] struct dso * VARYING
GORI TRUE : (800) produces (dso_8(D)) [irange] struct dso * [0,
0]
GORI TRUE : (798) outgoing_edge (dso_8(D)) [irange] struct dso * [0,
0]
GORI TRUE : (797) recomputation (_13) [irange] _Bool [1, 1]
I don't think we can do this. Andrew?