[Bug target/24230] [4.1 Regression] [altivec] ICE in extract_insn, at recog.c:2084

bonzini at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Tue Oct 11 11:38:00 GMT 2005



------- 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



More information about the Gcc-bugs mailing list