------- Comment #1 from rguenth at gcc dot gnu dot org 2006-10-23 10:14 ------- Slightly more reduced:
void stpi_unpack_16_1(int length, unsigned char *out, unsigned char bit) { unsigned char tempin; unsigned char temp[16]; for (bit = 128; length > 0; length--) { if (tempin & 128) temp[0] |= bit; else { *out++ = temp[1]; *out++ = temp[2]; *out++ = temp[3]; *out++ = temp[4]; *out++ = temp[5]; *out++ = temp[6]; *out++ = temp[7]; *out++ = temp[9]; *out++ = temp[10]; *out++ = temp[11]; *out++ = temp[12]; *out++ = temp[13]; *out++ = temp[14]; *out++ = temp[15]; __builtin_memset (temp, 0, 16); } } } it ICEs on /* We track only variables whose size is <= MAX_VAR_PARTS bytes thus there are at most MAX_VAR_PARTS different offsets. */ gcc_assert (var->n_var_parts < MAX_VAR_PARTS); because var->n_var_parts is == MAX_VAR_PARTS. It looks like the analysis part is wrong in trying to track temp[]. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29558