My patches to more "accurately" detect the number of zero elements in a
compound initialiser caused pr34856 to trigger on powerpc*-darwin:

    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34856
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49987

The problem is the same as it was on i386 and spu: the backend can
create CONST_VECTORs with symbolic elements, which in the 34856 trail
above was decided to be invalid.  Although a patch was written for
powerpc at the same time, the problem apparently didn't trigger on
powerpc targets until after my patch.

Tested by Dominique on powerpc-apple-darwin9.8.0 (thanks).  OK to install?

Richard


gcc/
        PR target/49987
        * config/rs6000/rs6000.c (paired_expand_vector_init): Check for
        valid CONST_VECTOR operands.
        (rs6000_expand_vector_init): Likewise.

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c  2011-08-18 13:37:31.395814534 +0100
+++ gcc/config/rs6000/rs6000.c  2011-08-23 11:35:07.417677742 +0100
@@ -4503,7 +4503,9 @@ paired_expand_vector_init (rtx target, r
   for (i = 0; i < n_elts; ++i)
     {
       x = XVECEXP (vals, 0, i);
-      if (!CONSTANT_P (x))
+      if (!(CONST_INT_P (x)
+           || GET_CODE (x) == CONST_DOUBLE
+           || GET_CODE (x) == CONST_FIXED))
        ++n_var;
     }
   if (n_var == 0)
@@ -4655,7 +4657,9 @@ rs6000_expand_vector_init (rtx target, r
   for (i = 0; i < n_elts; ++i)
     {
       x = XVECEXP (vals, 0, i);
-      if (!CONSTANT_P (x))
+      if (!(CONST_INT_P (x)
+           || GET_CODE (x) == CONST_DOUBLE
+           || GET_CODE (x) == CONST_FIXED))
        ++n_var, one_var = i;
       else if (x != CONST0_RTX (inner_mode))
        all_const_zero = false;

Reply via email to