https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101223
--- Comment #7 from Andrew Macleod <amacleod at redhat dot com> --- I think this is our old friend 1-bit signed overflow. for 1 signed bit values, varying is [-1, 0] range-op::build_lt checks to see if UB - 1 overflows, and if it does, then the result is undefined. wi::sub sets the overflow flag for 0 - 1 with 1 bit signed... so the comparison ends up being undefined, and we then make incorrect choices because we think we can. I think we need to, yet again, special case 1-bit signed values here, and probably in build_gt as well.