https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126536

            Bug ID: 126536
           Summary: [13/14/15/16/17 Regression] ICE with -funswitch-loops
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ktkachov at gcc dot gnu.org
  Target Milestone: ---

/* GCC trunk 908c597d3, aarch64: irange::invert overflows an int_range_max that
   is already at HARD_MAX_RANGES (255 sub-ranges).

   Entry point: irange::invert (gcc/value-range.cc:2529), reached from
   unswitch_predicate::unswitch_predicate (gcc/tree-ssa-loop-unswitch.cc:119).

   maybe_resize (value-range.h:801) returns without growing when
   m_max_ranges == HARD_MAX_RANGES, so invert writes pair 256 into a 255 pair
   buffer and then stores 256 into the unsigned char m_num_ranges, which
   truncates to 0.

     gcc -O3 invert-02-hard-max-ranges-unswitch.c
       during GIMPLE pass: unswitch
       internal compiler error: in type, at value-range.h:1081
       0x152e8d7 irange::invert()                value-range.cc:2593
       0x13222c7 unswitch_predicate::unswitch_predicate(..., int_range<3u,
true> const&)
                                                 tree-ssa-loop-unswitch.cc:119

   Exactly 255 case labels is the threshold: 254 compiles clean, 255 ICEs.
   Also ICEs with -O2 -funswitch-loops.  Same root cause as invert-01, but the
   object there is an int_range_max too, not a fixed int_range<N>.  */

volatile int v;

__attribute__((noipa)) int
f (int a, int n)
{
  int s = 0;
  for (int i = 0; i < n; i++)
    {
      switch (a)
        {
        case 1: case 3: case 5: case 7: case 9: case 11: case 13: case 15: case
17: case 19: case 21: case 23: case 25: case 27: case 29:
    case 31: case 33: case 35: case 37: case 39: case 41: case 43: case 45:
case 47: case 49: case 51: case 53: case 55: case 57: case 59:
    case 61: case 63: case 65: case 67: case 69: case 71: case 73: case 75:
case 77: case 79: case 81: case 83: case 85: case 87: case 89:
    case 91: case 93: case 95: case 97: case 99: case 101: case 103: case 105:
case 107: case 109: case 111: case 113: case 115: case 117: case 119:
    case 121: case 123: case 125: case 127: case 129: case 131: case 133: case
135: case 137: case 139: case 141: case 143: case 145: case 147: case 149:
    case 151: case 153: case 155: case 157: case 159: case 161: case 163: case
165: case 167: case 169: case 171: case 173: case 175: case 177: case 179:
    case 181: case 183: case 185: case 187: case 189: case 191: case 193: case
195: case 197: case 199: case 201: case 203: case 205: case 207: case 209:
    case 211: case 213: case 215: case 217: case 219: case 221: case 223: case
225: case 227: case 229: case 231: case 233: case 235: case 237: case 239:
    case 241: case 243: case 245: case 247: case 249: case 251: case 253: case
255: case 257: case 259: case 261: case 263: case 265: case 267: case 269:
    case 271: case 273: case 275: case 277: case 279: case 281: case 283: case
285: case 287: case 289: case 291: case 293: case 295: case 297: case 299:
    case 301: case 303: case 305: case 307: case 309: case 311: case 313: case
315: case 317: case 319: case 321: case 323: case 325: case 327: case 329:
    case 331: case 333: case 335: case 337: case 339: case 341: case 343: case
345: case 347: case 349: case 351: case 353: case 355: case 357: case 359:
    case 361: case 363: case 365: case 367: case 369: case 371: case 373: case
375: case 377: case 379: case 381: case 383: case 385: case 387: case 389:
    case 391: case 393: case 395: case 397: case 399: case 401: case 403: case
405: case 407: case 409: case 411: case 413: case 415: case 417: case 419:
    case 421: case 423: case 425: case 427: case 429: case 431: case 433: case
435: case 437: case 439: case 441: case 443: case 445: case 447: case 449:
    case 451: case 453: case 455: case 457: case 459: case 461: case 463: case
465: case 467: case 469: case 471: case 473: case 475: case 477: case 479:
    case 481: case 483: case 485: case 487: case 489: case 491: case 493: case
495: case 497: case 499: case 501: case 503: case 505: case 507: case 509:
          s += 1; break;
        default:
          s += 2; break;
        }
      v++;
    }
  return s;
}

int
main (void)
{
  if (f (1, 3) != 3)
    __builtin_abort ();
  if (f (2, 3) != 6)
    __builtin_abort ();
  return 0;
}

ICEs on aarch64 with -O2 -funswitch-loops

Reply via email to