http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55686
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-12-14 11:26:15 UTC --- Even more reduced: struct S { unsigned long *s, *t; }; unsigned long *q; void foo (struct S *x, unsigned long y, unsigned long z, int w) { unsigned long *d = x->t, j; if (w) for (j = 0; j < z; j++) *d++ = q[-j]; register unsigned long *g __asm__ ("edi"); register struct S *h __asm__ ("esi"); h->s = g; h->t--; foo (h, h->t[-1], g[1], (int) g[2]); goto *(void *) *g; } ICEd with reload too, starting with http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=185465 The reload ICE was pr55686.c: In function ‘foo’: pr55686.c:17:1: error: unable to find a register to spill in class ‘DIREG’ pr55686.c:17:1: error: this is the insn: (insn 29 28 30 5 (parallel [ (set (mem:SI (reg/v/f:SI 1 dx [orig:66 d ] [66]) [4 MEM[base: d_9, offset: 4294967292B]+0 S4 A32]) (reg:SI 0 ax [orig:67 D.1379 ] [67])) (set (reg/v/f:SI 1 dx [orig:66 d ] [66]) (plus:SI (reg/v/f:SI 1 dx [orig:66 d ] [66]) (const_int 4 [0x4]))) ]) pr55686.c:10 883 {*strsetsi_1} (expr_list:REG_DEAD (reg:SI 0 ax [orig:67 D.1379 ] [67]) (nil))) pr55686.c:17:1: internal compiler error: in spill_failure, at reload1.c:2120 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions.