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