]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/51058 (ICE: gimple check: expected gimple_assign(error_mark...
authorIra Rosen <ira.rosen@linaro.org>
Thu, 10 Nov 2011 10:14:24 +0000 (10:14 +0000)
committerIra Rosen <irar@gcc.gnu.org>
Thu, 10 Nov 2011 10:14:24 +0000 (10:14 +0000)
        PR tree-optimization/51058
        * tree-vect-slp.c (vect_get_constant_vectors): Handle CALL_EXPR.

From-SVN: r181251

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/vect/pr51058.f90 [new file with mode: 0644]
gcc/tree-vect-slp.c

index e3a268fd31a2557d7a515927572eb9ab1d35646f..380779b5d106073d8036e784893f38d2052f9cac 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-10  Ira Rosen  <ira.rosen@linaro.org>
+
+       PR tree-optimization/51058
+       * tree-vect-slp.c (vect_get_constant_vectors): Handle CALL_EXPR.
+
 2011-11-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/51000
index 31f53066f0a0286ea653569d034bcdbf2ecd8656..2d7d99b431f80bd02b4f9117eef384bdb19b318b 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-10  Ira Rosen  <ira.rosen@linaro.org>
+
+       PR tree-optimization/51058
+       * gfortran.dg/vect/pr51058.f90: New test.
+
 2011-11-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/51000
diff --git a/gcc/testsuite/gfortran.dg/vect/pr51058.f90 b/gcc/testsuite/gfortran.dg/vect/pr51058.f90
new file mode 100644 (file)
index 0000000..abee4c8
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do compile }
+
+      SUBROUTINE MLIST(MOLsp,PBCx,PBCy,PBCz, X0)
+      IMPLICIT NONE
+      INTEGER, PARAMETER :: NM=16384
+      INTEGER :: MOLsp, i
+      REAL :: PBCx, PBCy, PBCz, boxjmp, HALf=1./2.
+      REAL :: X0(2,-2:NM)
+
+         DO i = 1 , MOLsp
+            boxjmp = PBCx*INT(X0(1,i)+SIGN(HALf,X0(1,i)))
+            X0(1,i) = X0(1,i) - boxjmp
+            boxjmp = PBCy*INT(X0(2,i)+SIGN(HALf,X0(2,i)))
+            X0(2,i) = X0(2,i) - boxjmp
+         ENDDO
+      END
+
+! { dg-final { cleanup-tree-dump "vect" } }
+
index f54a8a772800e2a5b4bd0984eea8ae7cbfd56b3b..7ceb6fe8734f1008006af0416caf8f47d17491f1 100644 (file)
@@ -2191,7 +2191,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
   VEC (tree, heap) *voprnds = VEC_alloc (tree, heap, number_of_vectors);
   bool constant_p, is_store;
   tree neutral_op = NULL;
-  enum tree_code code = gimple_assign_rhs_code (stmt);
+  enum tree_code code = gimple_expr_code (stmt);
   gimple def_stmt;
   struct loop *loop;
 
@@ -2287,21 +2287,31 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
         {
           if (is_store)
             op = gimple_assign_rhs1 (stmt);
-          else if (gimple_assign_rhs_code (stmt) != COND_EXPR)
-            op = gimple_op (stmt, op_num + 1);
-         else
+          else
            {
-             if (op_num == 0 || op_num == 1)
-               {
-                 tree cond = gimple_assign_rhs1 (stmt);
-                 op = TREE_OPERAND (cond, op_num);
-               }
-             else
+             switch (code)
                {
-                 if (op_num == 2)
-                   op = gimple_assign_rhs2 (stmt);
-                 else
-                   op = gimple_assign_rhs3 (stmt);
+                 case COND_EXPR:
+                   if (op_num == 0 || op_num == 1)
+                     {
+                       tree cond = gimple_assign_rhs1 (stmt);
+                       op = TREE_OPERAND (cond, op_num);
+                     }
+                   else
+                     {
+                       if (op_num == 2)
+                         op = gimple_assign_rhs2 (stmt);
+                       else
+                         op = gimple_assign_rhs3 (stmt);
+                     }
+                   break;
+
+                 case CALL_EXPR:
+                   op = gimple_call_arg (stmt, op_num);
+                   break;
+
+                 default:
+                   op = gimple_op (stmt, op_num + 1);
                }
            }