https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119690
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I think at -O1 in *.sra it is still correct, we have <bb 2> [local count: 118111600]: a.0_12 = a; b.1_13 = b; _14 = a.0_12 + b.1_13; _15 = _14 + 2147483647; c = _15; if (_15 <= 0) goto <bb 3>; [89.00%] else goto <bb 4>; [11.00%] <bb 3> [local count: 955630224]: # _18 = PHI <_3(3), _14(2)> _5 = _18 - -2147483648; a = _5; a.0_1 = a; b.1_2 = b; _3 = a.0_1 + b.1_2; _4 = _3 + 2147483647; c = _4; if (_4 <= 0) goto <bb 3>; [89.00%] else goto <bb 4>; [11.00%] <bb 4> [local count: 118111600]: # a.0_17 = PHI <a.0_1(3), a.0_12(2)> if (a.0_17 != 1) goto <bb 5>; [0.00%] else goto <bb 6>; [100.00%] <bb 5> [count: 0]: # USE = nonlocal escaped # CLB = nonlocal escaped __builtin_abort (); <bb 6> [local count: 118111600]: return 0; where _14 for non-UB should be [-INF, 0] (it is -__INT_MAX__, so ok), and in bb3 from that edge because _15 <= 0 it implies _14 is in [-INF, -INT_MAX]. For that _5 has [0, 1] range. For _4 <= 0 the same applies for _3. So the ranges from dom2 look reasonable to me: Global Exported: _4 = [irange] int [-1, +INF] Global Exported: _5 = [irange] int [0, 1] MASK 0x80000001 VALUE 0x0 Global Exported: _15 = [irange] int [-1, +INF] Global Exported: _18 = [irange] int [-INF, -2147483647]