aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-stmts.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-01-14 09:04:50 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-01-14 09:04:50 +0000
commita0e35eb02c65ca7aa1c429a1032a463129623669 (patch)
treec2fa988fd84ae971571c3f7df4e8a8c3314bd336 /gcc/tree-vect-stmts.c
parent1c76069c9d792c4c1f5ae58dfc76aed463fedbed (diff)
downloadgcc-a0e35eb02c65ca7aa1c429a1032a463129623669.zip
gcc-a0e35eb02c65ca7aa1c429a1032a463129623669.tar.gz
gcc-a0e35eb02c65ca7aa1c429a1032a463129623669.tar.bz2
re PR tree-optimization/58921 (ICE with segfault on valid code at -O3 on x86_64-linux-gnu)
2014-01-14 Richard Biener <rguenther@suse.de> PR tree-optimization/58921 PR tree-optimization/59006 * tree-vect-loop-manip.c (vect_loop_versioning): Remove code hoisting invariant stmts. * tree-vect-stmts.c (vectorizable_load): Insert the splat of invariant loads on the preheader edge if possible. * gcc.dg/torture/pr58921.c: New testcase. * gcc.dg/torture/pr59006.c: Likewise. * gcc.dg/vect/pr58508.c: XFAIL no longer handled cases. From-SVN: r206599
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r--gcc/tree-vect-stmts.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index cdeb457..acdaa2d 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -6380,12 +6380,39 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
/* 4. Handle invariant-load. */
if (inv_p && !bb_vinfo)
{
- gimple_stmt_iterator gsi2 = *gsi;
gcc_assert (!grouped_load);
- gsi_next (&gsi2);
- new_temp = vect_init_vector (stmt, scalar_dest,
- vectype, &gsi2);
+ /* If we have versioned for aliasing then we are sure
+ this is a loop invariant load and thus we can insert
+ it on the preheader edge. */
+ if (LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo))
+ {
+ if (dump_enabled_p ())
+ {
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "hoisting out of the vectorized "
+ "loop: ");
+ dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 0);
+ dump_printf (MSG_NOTE, "\n");
+ }
+ tree tem = copy_ssa_name (scalar_dest, NULL);
+ gsi_insert_on_edge_immediate
+ (loop_preheader_edge (loop),
+ gimple_build_assign (tem,
+ unshare_expr
+ (gimple_assign_rhs1 (stmt))));
+ new_temp = vect_init_vector (stmt, tem, vectype, NULL);
+ }
+ else
+ {
+ gimple_stmt_iterator gsi2 = *gsi;
+ gsi_next (&gsi2);
+ new_temp = vect_init_vector (stmt, scalar_dest,
+ vectype, &gsi2);
+ }
new_stmt = SSA_NAME_DEF_STMT (new_temp);
+ set_vinfo_for_stmt (new_stmt,
+ new_stmt_vec_info (new_stmt, loop_vinfo,
+ bb_vinfo));
}
if (negative)