tree-vect-stmts.c (vectorizable_load): Allocate and free dr_chain within the per...
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 14 Apr 2011 11:54:30 +0000 (11:54 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 14 Apr 2011 11:54:30 +0000 (11:54 +0000)
gcc/
* tree-vect-stmts.c (vectorizable_load): Allocate and free dr_chain
within the per-copy loop.

From-SVN: r172422

gcc/ChangeLog
gcc/tree-vect-stmts.c

index f813f740778230c87c430ca6eeeea596a819c6a2..572b6affd33caa82336f1d7c02d38890a1e25753 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-14  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * tree-vect-stmts.c (vectorizable_load): Allocate and free dr_chain
+       within the per-copy loop.
+
 2011-04-14  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * tree-vect-stmts.c (vectorizable_load): Print the number of copies
index 9e9a0bbe2f307ef6db179f716d0eb14874a8aad6..eeb922377a8ab3499eb8319014ad103ffd3a43a2 100644 (file)
@@ -3961,8 +3961,6 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
        }
       else
        vec_num = group_size;
-
-      dr_chain = VEC_alloc (tree, heap, vec_num);
     }
   else
     {
@@ -4116,6 +4114,9 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
         dataref_ptr =
                bump_vector_ptr (dataref_ptr, ptr_incr, gsi, stmt, NULL_TREE);
 
+      if (strided_load || slp_perm)
+       dr_chain = VEC_alloc (tree, heap, vec_num);
+
       for (i = 0; i < vec_num; i++)
        {
          if (i > 0)
@@ -4325,8 +4326,6 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
                return false;
 
              *vec_stmt = STMT_VINFO_VEC_STMT (stmt_info);
-              VEC_free (tree, heap, dr_chain);
-             dr_chain = VEC_alloc (tree, heap, group_size);
            }
           else
            {
@@ -4337,11 +4336,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
              prev_stmt_info = vinfo_for_stmt (new_stmt);
            }
         }
+      if (dr_chain)
+       VEC_free (tree, heap, dr_chain);
     }
 
-  if (dr_chain)
-    VEC_free (tree, heap, dr_chain);
-
   return true;
 }