https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117287
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- _Z3bazj._assume.0 assume inferred range of x_2(D) (param x) = [irange] unsigned int [9, 10] MASK 0x3 VALUE 0x8 on-exit update x_2(D) in BB2 : [irange] unsigned int [9, 10] MASK 0x3 VALUE 0x8 The _Z3bazj._assume.0 function body is <bb 2> [local count: 1073741822]: _3 = x_2(D) + 4294967292; if (_3 <= 1) goto <bb 4>; [41.00%] else goto <bb 3>; [59.00%] <bb 3> [local count: 633507679]: if (x_2(D) == 9) goto <bb 4>; [34.00%] else goto <bb 5>; [66.00%] <bb 4> [local count: 797785881]: goto <bb 6>; [100.00%] <bb 5> [local count: 418115066]: if (x_2(D) == 10) goto <bb 4>; [34.00%] else goto <bb 6>; [66.00%] <bb 6> [local count: 1073741824]: # iftmp.3_4 = PHI <1(4), 0(5)> return iftmp.3_4; and so for x - 4U <= 1 should return 1 (i.e. [4,5] range), or for [9,9], or for [10,10].