re PR target/34856 (ICE with some constant vectors)
authorUlrich Weigand <uweigand@de.ibm.com>
Sat, 28 Jun 2008 10:47:36 +0000 (10:47 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Sat, 28 Jun 2008 10:47:36 +0000 (10:47 +0000)
PR target/34856
* config/spu/spu.c (spu_builtin_splats): Do not generate
invalid CONST_VECTOR expressions.
(spu_expand_vector_init): Likewise.

From-SVN: r137218

gcc/ChangeLog
gcc/config/spu/spu.c

index 87b85c00552cb891d2660a4b641e1633efc11215..3fccc8f3c21e8d6fa64536201412c6694f0bb364 100644 (file)
@@ -1,3 +1,10 @@
+2008-06-28  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       PR target/34856
+       * config/spu/spu.c (spu_builtin_splats): Do not generate
+       invalid CONST_VECTOR expressions.
+       (spu_expand_vector_init): Likewise.
+
 2008-06-28  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * optabs.c (libfunc_decls): New variable.
index 4dd3d7cc0fe5b29e279ba0835b5a1e987ce6797e..e645adb22818569f1be50e87278128c71a00b8b8 100644 (file)
@@ -4576,15 +4576,6 @@ spu_builtin_splats (rtx ops[])
       constant_to_array (GET_MODE_INNER (mode), ops[1], arr);
       emit_move_insn (ops[0], array_to_constant (mode, arr));
     }
-  else if (!flag_pic && GET_MODE (ops[0]) == V4SImode && CONSTANT_P (ops[1]))
-    {
-      rtvec v = rtvec_alloc (4);
-      RTVEC_ELT (v, 0) = ops[1];
-      RTVEC_ELT (v, 1) = ops[1];
-      RTVEC_ELT (v, 2) = ops[1];
-      RTVEC_ELT (v, 3) = ops[1];
-      emit_move_insn (ops[0], gen_rtx_CONST_VECTOR (mode, v));
-    }
   else
     {
       rtx reg = gen_reg_rtx (TImode);
@@ -4903,7 +4894,9 @@ spu_expand_vector_init (rtx target, rtx vals)
   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;
       else
        {
@@ -4940,8 +4933,13 @@ spu_expand_vector_init (rtx target, rtx vals)
          /* fill empty slots with the first constant, this increases
             our chance of using splats in the recursive call below. */
          for (i = 0; i < n_elts; ++i)
-           if (!CONSTANT_P (XVECEXP (constant_parts_rtx, 0, i)))
-             XVECEXP (constant_parts_rtx, 0, i) = first_constant;
+           {
+             x = XVECEXP (constant_parts_rtx, 0, i);
+             if (!(CONST_INT_P (x)
+                   || GET_CODE (x) == CONST_DOUBLE
+                   || GET_CODE (x) == CONST_FIXED))
+               XVECEXP (constant_parts_rtx, 0, i) = first_constant;
+           }
 
          spu_expand_vector_init (target, constant_parts_rtx);
        }
@@ -4957,7 +4955,9 @@ spu_expand_vector_init (rtx target, rtx vals)
       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))
            {
              if (!register_operand (x, GET_MODE (x)))
                x = force_reg (GET_MODE (x), x);