------- Comment #3 from pinskia at gcc dot gnu dot org 2008-01-23 04:39 ------- Here is a reduced C testcase compile with -O2 -maltivec: #define vector __attribute__((vector_size(16) ))
vector int f(int a, int b) { int g[100000]={}; g[a] = b; return (vector int){a,a,a,a} + (vector int){g[b], g[b], g[b], g[b]}; } Note the reason for g is to make virtual-stack-vars large enough so we get: (insn 22 21 23 t.c:7 (parallel [ (set (reg:V4SI 132) (mem/c/i:V4SI (plus:DI (reg/f:DI 115 virtual-stack-vars) (const_int 400000 [0x61a80])) [3 S16 A128])) (unspec [ (const_int 0 [0x0]) ] 196) ]) -1 (nil)) And then when instantiate_virtual_regs_in_insn comes around, it does a separate load for the mem. I don't know if this is a bug in altivec.md for the unspec being done incorrectly or a bug in instantiate_virtual_regs_in_insn where it tries to fix up the lve's memory location but it pulls the memory load out instead of just the address. -- pinskia at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 GCC build triplet|powerpc-apple-darwin9 | GCC host triplet|powerpc-apple-darwin9 | GCC target triplet|powerpc-apple-darwin9 |powerpc*-*-* Last reconfirmed|0000-00-00 00:00:00 |2008-01-23 04:39:17 date| | Summary|[4.3 Regression] |[4.3 Regression] ICE in |gfortran.dg/cray_pointers_2.|instantiate_virtual_regs_in_ |f90:3360: internal compiler |insn with vector splat load |error: in | |instantiate_virtual_regs_in_| |insn, at function.c:1564 | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34930