https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90753
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- The reason is simple -- only PRE will rewrite i into SSA form, so this is a pass ordering issue (VRP doesn't track ranges of "memory" - in theory EVRP could, but of course aliasing makes derived ranges not useful for optimization/possibly incorrect or the analysis way more costly). <bb 2> [local count: 1073741824]: i.1_1 = i; i.2_2 = (unsigned int) i.1_1; _3 = i.2_2 + 4294967287; if (_3 > 90) goto <bb 3>; [50.00%] else goto <bb 4>; [50.00%] <bb 3> [local count: 536870913]: i = 9; <bb 4> [local count: 1073741824]: # prephitmp_12 = PHI <9(3), i.1_1(2)> _5 = a[prephitmp_12]; _9 = (int) _5;