https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117088
Andrew Macleod <amacleod at redhat dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amacleod at redhat dot com --- Comment #4 from Andrew Macleod <amacleod at redhat dot com> --- (In reply to Jan Hubicka from comment #3) > > digits_2.isra (1); > > > > so we at least know row is [1, +INF] since the add is signed. > > > > We might be able to use a SCEV-like range computation for recursive cases > > like > > this, then being able to compute [2, 8] for the recursion invocation. Not > > sure whether doing this in local VRP is possible and how much of help symtab > > is here (single caller). > > ipa-prop already understands that the recursion depth is bounded > by 10 for cloning reasons, so perhaps this can be turned to value range > easily? > > Honza void digits_2.isra (integer(kind=4) ISRA.6607) { integer(kind=4) ISRA.6607_927(D) = ISRA.6607; ... # RANGE [irange] integer(kind=4) [-2147483647, 8][10, +INF] _494 = ISRA.6607_927(D) + 1; by the time VRP sees it, i think ISRA.6607_927(D) is the actual parameter? if you set SSA_NAME_RANGE_INFO (ISRA.6607_927(D)) to [1, +INF] or [1, 10] or whatever, VRP will likely do some useful things. VRP can't figure out the non-negative part on its own as the fact that it is always [1, INF] is not apparent from within the function. Someone has to provide that info via the ssa-name passed as the parameter. _494 will share the lower bound (well, +1) of whatever ISRA.6607_927(D) has. It currently has no value, so it is VARYING as far as VRP known. which is why _494 has a lower bound of -INF+1. It also appears to be in a loop with the condition being _494 != 9 or something related like that. Its never been clear ot me why we still change loop branches to use !=. We turn for (int y = 0 ; y < 10; y++) b[y] = x; into if (y_1 != 10) goto <bb 3>; [INV] else goto <bb 5>; [INV] and as a result, range analysis only picks up that y_1 is not 10. whereas if that had remained if (y_1 < 10) goto <bb 3>; [INV] else goto <bb 5>; [INV] we'd at least have picked up y_1 is [-INF, 9] at in BB3 instead of [-INF,9[11, +INF] Instead, it has to depend on loop analysis to find values that could just be apparent.