https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117282
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2024-10-24
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
>Is it feasible that we rely on this option to peel away conversion losslessly
>in this optimization?
No because you could do a malloc of a big size. The smallest limit for an
example is 39bits addressing on aarch64 (512GB) for the VA space.
Othewise, in first case, we have missing a VRP:
if (_9 == 0)
goto <bb 6>; [11.00%]
else
goto <bb 3>; [89.00%]
<bb 3> [local count: 955630224]:
# t_10 = PHI <t_6(3), s_4(D)(2)>
t_6 = t_10 + 1;
_1 = MEM[(char *)t_6];
if (_1 == 0)
goto <bb 4>; [11.00%]
else
goto <bb 3>; [89.00%]
<bb 4> [local count: 105119324]:
if (s_4(D) != t_6)
goto <bb 5>; [60.08%]
else
goto <bb 6>; [39.92%]
t_6 can never be s_4(D) due to pointer overflowing being undefined.
in the second case we could peel off the first iteration of the loop and it
would work:
;; basic block 3, loop depth 1, count 1063004408 (estimated locally, freq
15.3607), maybe hot
;; prev block 2, next block 4, flags: (NEW, REACHABLE, VISITED)
;; pred: 4 [98.9% (guessed)] count:993801746 (estimated locally, freq
14.3607) (TRUE_VALUE,EXECUTABLE)
;; 2 [always] count:69202658 (estimated locally, freq 1.0000)
(FALLTHRU,EXECUTABLE)
# RANGE [irange] unsigned long [0, 9999]
# ivtmp.18_19 = PHI <ivtmp.18_18(4), 0(2)>
# VUSE <.MEM_8(D)>
_3 = MEM[(charD.10 *)s_7(D) + ivtmp.18_19 * 1];
if (_3 == 0)
goto <bb 5>; [5.50%]
else
goto <bb 4>; [94.50%]
;; succ: 5 [5.5% (guessed)] count:58465242 (estimated locally, freq
0.8448) (TRUE_VALUE,EXECUTABLE)
;; 4 [94.5% (guessed)] count:1004539166 (estimated locally,
freq 14.5159) (FALSE_VALUE,EXECUTABLE)
;; basic block 4, loop depth 1, count 1004539166 (estimated locally, freq
14.5159), maybe hot
;; prev block 3, next block 5, flags: (NEW, REACHABLE, VISITED)
;; pred: 3 [94.5% (guessed)] count:1004539166 (estimated locally,
freq 14.5159) (FALSE_VALUE,EXECUTABLE)
# RANGE [irange] unsigned long [1, 10000]
ivtmp.18_18 = ivtmp.18_19 + 1;
if (ivtmp.18_18 != 10000)
goto <bb 3>; [98.93%]
else
goto <bb 6>; [1.07%]
;; succ: 3 [98.9% (guessed)] count:993801746 (estimated locally, freq
14.3607) (TRUE_VALUE,EXECUTABLE)
;; 6 [1.1% (guessed)] count:10737420 (estimated locally, freq
0.1552) (FALSE_VALUE,EXECUTABLE)
So multiple cases.
Does this code show up in a benchmark?