struct S { void *s[256]; }; struct T { long t[23]; struct S *u; };
extern struct T #ifdef __ia64__ __attribute__((model (small))) #endif v; void * foo (void) { return v.u->s[0]; } ICEs on gcc-4_0-branch at -O2, but did not ICE before the PR target/21412 patch was checked in. The only difference appears in *.flow2, where older GCC split (insn 12 18 13 0 (set (reg/f:DI 14 r14 [344]) (const:DI (plus:DI (symbol_ref:DI ("v") [flags 0xc0] <var_decl 0x2aaaad2f30d0 v>) (const_int 184 [0xb8])))) 5 {*movdi_internal} (nil) (expr_list:REG_EQUIV (const:DI (plus:DI (symbol_ref:DI ("v") [flags 0xc0] <var_decl 0x2aaaad2f30d0 v>) (const_int 184 [0xb8]))) (nil))) into (insn 35 18 36 0 (set (reg/f:DI 14 r14 [344]) (symbol_ref:DI ("v") [flags 0xc0] <var_decl 0x2aaaad2f30d0 v>)) 5 {*movdi_internal} (nil) (nil)) (insn 36 35 13 0 (set (reg/f:DI 14 r14 [344]) (plus:DI (reg/f:DI 14 r14 [344]) (const_int 184 [0xb8]))) 101 {adddi3} (nil) (nil)) while current 4.0 branch keeps it unsplitted, so it aborts later on in movdi_internal's if (which_alternative == 2 && ! TARGET_NO_PIC && symbolic_operand (operands[1], VOIDmode)) abort (); -- Summary: ICE with small model attribute on ia64 Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org,rth at gcc dot gnu dot org GCC target triplet: ia64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21632