https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109637
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Macleod from comment #2) > > Why are we adding -1 to [0,3] ? Thats the root of this issue I think? > seems strange if we ignore the range for a second. When switch conversion happens we have: switch (_1) <default: <L5> [INV], case 1: <L1> [INV], case 2: <L2> [INV], case 3: <L3> [INV]> So when _1 is either 0 or > 3, default case will happen. The real problem is switch conversion promotes to a 8 bit type when it does the comparisons and does not take into the ranges. Related testcase (ignoring that there is a bogus warning, see PR 95513 for that and not fixed even with my VRP patch): ``` int f (unsigned t) { switch(t & 0x3) { case 0: return 0; case 1: return 1; case 2: return 2; case 3: return 3; } } ``` my VRP patch also fixes the above. Now switch conversion should use the range info too. I will look into adding that .... But at least we get decent code for the orginal and related cases now.