On 02/27/2013 01:21 PM, Jakub Jelinek wrote:
Hi!
This function used vec copy () method, but unfortunately that allocates
a fresh new vector and overwrites the target vector<tree> variable with it
(making it leak memory).
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?
2013-02-27 Jakub Jelinek <ja...@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.
--- gcc/tree-vect-data-refs.c.jj 2013-02-05 16:45:40.000000000 +0100
+++ gcc/tree-vect-data-refs.c 2013-02-27 17:59:19.574144962 +0100
@@ -4673,7 +4673,9 @@ vect_permute_load_chain (vec<tree> dr_ch
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_ch
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));
}
}
OK.
Jeff