aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr58921.c17
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr59006.c13
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr58508.c3
-rw-r--r--gcc/tree-vect-loop-manip.c67
-rw-r--r--gcc/tree-vect-stmts.c35
7 files changed, 80 insertions, 72 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3a832d0..d9d1949 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+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.
+
2014-01-14 Joey Ye <joey.ye@arm.com>
* doc/plugin.texi (Building GCC plugins): Update to C++.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4c59e37..8a3b56d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2014-01-14 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/58921
+ PR tree-optimization/59006
+ * gcc.dg/torture/pr58921.c: New testcase.
+ * gcc.dg/torture/pr59006.c: Likewise.
+ * gcc.dg/vect/pr58508.c: XFAIL no longer handled cases.
+
2014-01-14 Jakub Jelinek <jakub@redhat.com>
PR testsuite/59494
diff --git a/gcc/testsuite/gcc.dg/torture/pr58921.c b/gcc/testsuite/gcc.dg/torture/pr58921.c
new file mode 100644
index 0000000..7d7c985
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr58921.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+int a[7];
+int b;
+
+void
+fn1 ()
+{
+ for (; b; b++)
+ a[b] = ((a[b] <= 0) == (a[0] != 0));
+}
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr59006.c b/gcc/testsuite/gcc.dg/torture/pr59006.c
new file mode 100644
index 0000000..34de83d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr59006.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+int a[8], b;
+void fn1(void)
+{
+ int c;
+ for (; b; b++)
+ {
+ int d = a[b];
+ c = a[0] ? d : 0;
+ a[b] = c;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr58508.c b/gcc/testsuite/gcc.dg/vect/pr58508.c
index c1ca334..c25da41 100644
--- a/gcc/testsuite/gcc.dg/vect/pr58508.c
+++ b/gcc/testsuite/gcc.dg/vect/pr58508.c
@@ -66,5 +66,6 @@ void test5 (int* a, int* b)
}
}
-/* { dg-final { scan-tree-dump-times "hoist" 8 "vect" { xfail vect_no_align } } } */
+/* { dg-final { scan-tree-dump-times "hoist" 8 "vect" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "hoist" 3 "vect" { xfail vect_no_align } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index f686261..77d945e 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -2435,73 +2435,6 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
}
}
-
- /* Extract load statements on memrefs with zero-stride accesses. */
-
- if (LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo))
- {
- /* In the loop body, we iterate each statement to check if it is a load.
- Then we check the DR_STEP of the data reference. If DR_STEP is zero,
- then we will hoist the load statement to the loop preheader. */
-
- basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
- int nbbs = loop->num_nodes;
-
- for (int i = 0; i < nbbs; ++i)
- {
- for (gimple_stmt_iterator si = gsi_start_bb (bbs[i]);
- !gsi_end_p (si);)
- {
- gimple stmt = gsi_stmt (si);
- stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
- struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
-
- if (is_gimple_assign (stmt)
- && (!dr
- || (DR_IS_READ (dr) && integer_zerop (DR_STEP (dr)))))
- {
- bool hoist = true;
- ssa_op_iter iter;
- tree var;
-
- /* We hoist a statement if all SSA uses in it are defined
- outside of the loop. */
- FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
- {
- gimple def = SSA_NAME_DEF_STMT (var);
- if (!gimple_nop_p (def)
- && flow_bb_inside_loop_p (loop, gimple_bb (def)))
- {
- hoist = false;
- break;
- }
- }
-
- if (hoist)
- {
- if (dr)
- gimple_set_vuse (stmt, NULL);
-
- gsi_remove (&si, false);
- gsi_insert_on_edge_immediate (loop_preheader_edge (loop),
- stmt);
-
- 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");
- }
- continue;
- }
- }
- gsi_next (&si);
- }
- }
- }
-
/* End loop-exit-fixes after versioning. */
if (cond_expr_stmt_list)
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)