This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/24230] [4.1 Regression] [altivec] ICE in extract_insn, at recog.c:2084
- From: "bonzini at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 11 Oct 2005 11:38:35 -0000
- Subject: [Bug target/24230] [4.1 Regression] [altivec] ICE in extract_insn, at recog.c:2084
- References: <bug-24230-10053@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #10 from bonzini at gcc dot gnu dot org 2005-10-11 11:38 -------
This is as small as I could make it. Any other attempt to hoist something
causes it not to fail anymore (at -maltivec -O2). Interesting, given that GCSE
*does* the hoisting...
It's a reload problem.
typedef __attribute__((vector_size (16))) unsigned char vec;
void H_Pass_16_Altivec_C(vec vec_src, vec firs, vec sums1, vec sums2,
vec *FIR_Tab_16, unsigned char *Src)
{
vec tmp, spltb3, spltb4, spltb5, spltb6, mrghb3, mrglb3, mrghb4, mrglb4,
mrghb5, mrglb5, mrghb6, mrglb6, firs0, firs1, firs2, firs3, upkhb0, upklb0,
upkhb1, upklb1, upkhb2, upklb2, upkhb3, upklb3, upkhb4, spltb7, mrghb7,
mrglb7, firs4, spltb8, mrghb8, mrglb8, upklb4;
spltb3 = __builtin_altivec_vspltb (vec_src, 3);
spltb4 = __builtin_altivec_vspltb (vec_src, 4);
spltb5 = __builtin_altivec_vspltb (vec_src, 5);
spltb6 = __builtin_altivec_vspltb (vec_src, 6);
mrghb3 = __builtin_altivec_vmrghb (spltb3, spltb3);
mrglb3 = __builtin_altivec_vmrglb (spltb3, spltb3);
mrghb4 = __builtin_altivec_vmrghb (spltb4, spltb4);
mrglb4 = __builtin_altivec_vmrglb (spltb4, spltb4);
mrghb5 = __builtin_altivec_vmrghb (spltb5, spltb5);
mrglb5 = __builtin_altivec_vmrglb (spltb5, spltb5);
mrghb6 = __builtin_altivec_vmrghb (spltb6, spltb6);
mrglb6 = __builtin_altivec_vmrglb (spltb6, spltb6);
firs0 = FIR_Tab_16[0];
firs1 = FIR_Tab_16[1];
firs2 = FIR_Tab_16[2];
firs3 = FIR_Tab_16[3];
upkhb0 = __builtin_altivec_vupkhsb (firs0);
upklb0 = __builtin_altivec_vupklsb (firs0);
upkhb1 = __builtin_altivec_vupkhsb (firs1);
upklb1 = __builtin_altivec_vupklsb (firs1);
upkhb2 = __builtin_altivec_vupkhsb (firs2);
upklb2 = __builtin_altivec_vupklsb (firs2);
upkhb3 = __builtin_altivec_vupkhsb (firs3);
upklb3 = __builtin_altivec_vupklsb (firs3);
upkhb4 = __builtin_altivec_vupkhsb (firs);
*(char *) &tmp = (char) *(Src + 16);
L0:
sums1 = __builtin_altivec_vmladduhm (mrghb3, upkhb4, sums1);
sums2 = __builtin_altivec_vmladduhm (mrglb3, upkhb4, sums2);
sums1 = __builtin_altivec_vmladduhm (mrghb4, upkhb0, sums1);
sums2 = __builtin_altivec_vmladduhm (mrglb4, upklb0, sums2);
sums1 = __builtin_altivec_vmladduhm (mrghb5, upkhb1, sums1);
sums2 = __builtin_altivec_vmladduhm (mrglb5, upklb1, sums2);
sums1 = __builtin_altivec_vmladduhm (mrghb6, upkhb2, sums1);
sums2 = __builtin_altivec_vmladduhm (mrglb6, upklb2, sums2);
spltb7 = __builtin_altivec_vspltb (vec_src, 7);
mrghb7 = __builtin_altivec_vmrghb (spltb7, spltb7);
sums1 = __builtin_altivec_vmladduhm (mrghb7, upkhb3, sums1);
mrglb7 = __builtin_altivec_vmrglb (spltb7, spltb7);
sums2 = __builtin_altivec_vmladduhm (mrglb7, upklb3, sums2);
firs4 = FIR_Tab_16[4];
spltb8 = __builtin_altivec_vspltb (vec_src, 8);
mrghb8 = __builtin_altivec_vmrghb (spltb8, spltb8);
upkhb4 = __builtin_altivec_vupkhsb (firs4);
sums1 = __builtin_altivec_vmladduhm (mrghb8, upkhb4, sums1);
mrglb8 = __builtin_altivec_vmrglb ((vec)tmp, spltb8);
upklb4 = __builtin_altivec_vupklsb (firs4);
sums2 = __builtin_altivec_vmladduhm (mrglb8, upklb4, sums2);
tmp = __builtin_altivec_vspltish (5);
sums1 = __builtin_altivec_vsrah (sums1, tmp);
__builtin_altivec_vpkshus (sums1, sums2);
goto L0;
}
--
bonzini at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
GCC target triplet|powerpc-*-linux-gnu |powerpc-*-*
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24230