aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-05-21 12:45:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-05-21 12:45:59 +0000
commit21039e0e003246c87d123bcd7099d411ac82a1fd (patch)
treef9e3d8cc6e12497d2fbf21bdd48492e542cb7cee /gcc
parent9b5effa449611ed3e8360d4e3440c6cc00c70035 (diff)
downloadgcc-21039e0e003246c87d123bcd7099d411ac82a1fd.zip
gcc-21039e0e003246c87d123bcd7099d411ac82a1fd.tar.gz
gcc-21039e0e003246c87d123bcd7099d411ac82a1fd.tar.bz2
re PR middle-end/53408 (ICE in get_initial_def_for_induction, at tree-vect-loop.c:3222)
2012-05-21 Richard Guenther <rguenther@suse.de> PR tree-optimization/53408 * tree-vect-loop.c (vectorizable_induction): Properly check the restriction that we cannot handle induction results from the inner loop outside of the outer loop. * gcc.dg/torture/pr53408.c: New testcase. From-SVN: r187710
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr53408.c20
-rw-r--r--gcc/tree-vect-loop.c44
4 files changed, 71 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3634b63..75190eb1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-21 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/53408
+ * tree-vect-loop.c (vectorizable_induction): Properly check
+ the restriction that we cannot handle induction results from
+ the inner loop outside of the outer loop.
+
2012-05-21 H.J. Lu <hongjiu.lu@intel.com>
PR target/53416
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3c82445..585ee31 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-21 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/53408
+ * gcc.dg/torture/pr53408.c: New testcase.
+
2012-05-21 Uros Bizjak <ubizjak@gmail.com>
H.J. Lu <hongjiu.lu@intel.com>
diff --git a/gcc/testsuite/gcc.dg/torture/pr53408.c b/gcc/testsuite/gcc.dg/torture/pr53408.c
new file mode 100644
index 0000000..25c6dc7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr53408.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+int a, b, c, d, e;
+void
+fn1 ()
+{
+ int f, g;
+ char h = 0;
+ b = 0;
+ for (; b < 32; b++)
+ {
+ g = h > e ? h : h << 1;
+ f = g && a ? 0 : 1;
+ h = 1;
+ for (; h > 0; h = h + 1)
+ c = 0 < h | f;
+ }
+ if (h)
+ d = 0;
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 5fe1165..528788f 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -5061,12 +5061,46 @@ vectorizable_induction (gimple phi, gimple_stmt_iterator *gsi ATTRIBUTE_UNUSED,
tree vec_def;
gcc_assert (ncopies >= 1);
- /* FORNOW. This restriction should be relaxed. */
- if (nested_in_vect_loop_p (loop, phi) && ncopies > 1)
+ /* FORNOW. These restrictions should be relaxed. */
+ if (nested_in_vect_loop_p (loop, phi))
{
- if (vect_print_dump_info (REPORT_DETAILS))
- fprintf (vect_dump, "multiple types in nested loop.");
- return false;
+ imm_use_iterator imm_iter;
+ use_operand_p use_p;
+ gimple exit_phi;
+ edge latch_e;
+ tree loop_arg;
+
+ if (ncopies > 1)
+ {
+ if (vect_print_dump_info (REPORT_DETAILS))
+ fprintf (vect_dump, "multiple types in nested loop.");
+ return false;
+ }
+
+ exit_phi = NULL;
+ latch_e = loop_latch_edge (loop->inner);
+ loop_arg = PHI_ARG_DEF_FROM_EDGE (phi, latch_e);
+ FOR_EACH_IMM_USE_FAST (use_p, imm_iter, loop_arg)
+ {
+ if (!flow_bb_inside_loop_p (loop->inner,
+ gimple_bb (USE_STMT (use_p))))
+ {
+ exit_phi = USE_STMT (use_p);
+ break;
+ }
+ }
+ if (exit_phi)
+ {
+ stmt_vec_info exit_phi_vinfo = vinfo_for_stmt (exit_phi);
+ if (!(STMT_VINFO_RELEVANT_P (exit_phi_vinfo)
+ && !STMT_VINFO_LIVE_P (exit_phi_vinfo)))
+ {
+ if (vect_print_dump_info (REPORT_DETAILS))
+ fprintf (vect_dump, "inner-loop induction only used outside "
+ "of the outer vectorized loop.");
+ return false;
+ }
+ }
}
if (!STMT_VINFO_RELEVANT_P (stmt_info))