diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7cc49fa929ed149dd6148272dc35b068e496dee4..08fd6b81a27a39e5597d57afefb6ca5c8a075da9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
 2013-02-27  Jakub Jelinek  <jakub@redhat.com>
 
+	PR middle-end/56461
+	* tree-vect-data-refs.c (vect_permute_load_chain): Avoid using copy
+	method on dr_chain and result_chain.
+
 	PR middle-end/56461
 	* tree-ssa-loop-niter.c (maybe_lower_iteration_bound): Call
 	pointer_set_destroy on not_executed_last_iteration.
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 74d8c3a41fa97dc230a3cd5e5bb564afe297a284..bf5a7b7731ff9a02c4169ae4b017031c3df88316 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -4673,7 +4673,9 @@ vect_permute_load_chain (vec<tree> dr_chain,
   unsigned nelt = TYPE_VECTOR_SUBPARTS (vectype);
   unsigned char *sel = XALLOCAVEC (unsigned char, nelt);
 
-  *result_chain = dr_chain.copy ();
+  result_chain->quick_grow (length);
+  memcpy (result_chain->address (), dr_chain.address (),
+	  length * sizeof (tree));
 
   for (i = 0; i < nelt; ++i)
     sel[i] = i * 2;
@@ -4708,7 +4710,8 @@ vect_permute_load_chain (vec<tree> dr_chain,
 	  vect_finish_stmt_generation (stmt, perm_stmt, gsi);
 	  (*result_chain)[j/2+length/2] = data_ref;
 	}
-      dr_chain = result_chain->copy ();
+      memcpy (dr_chain.address (), result_chain->address (),
+	      length * sizeof (tree));
     }
 }