aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr56366.c17
-rw-r--r--gcc/tree-vect-loop.c15
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ba374a1..0caa412 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2013-02-18 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/56366
+ * tree-vect-loop.c (get_initial_def_for_induction): Properly
+ handle sign-conversion of outer-loop initial induction value.
+
+2013-02-18 Richard Biener <rguenther@suse.de>
+
PR middle-end/56349
* cfghooks.c (merge_blocks): If we merge a latch into another
block adjust references to it.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0c88ce2..fe995e8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2013-02-18 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/56366
+ * gcc.dg/torture/pr56366.c: New testcase.
+
+2013-02-18 Richard Biener <rguenther@suse.de>
+
PR middle-end/56349
* gcc.dg/torture/pr56349.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr56366.c b/gcc/testsuite/gcc.dg/torture/pr56366.c
new file mode 100644
index 0000000..15a4300
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr56366.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+int a, *c, d;
+unsigned short b;
+short e;
+
+void f(void)
+{
+ for(;; d++)
+ {
+ for(a = -9; a < 63; a++)
+ for(d = 0; d < 9; d++)
+ b -= --e;
+
+ a = b & *c;
+ }
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index d4f6bc7..a2f9013 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -3203,6 +3203,21 @@ get_initial_def_for_induction (gimple iv_phi)
tree iv_def = PHI_ARG_DEF_FROM_EDGE (iv_phi,
loop_preheader_edge (iv_loop));
vec_init = vect_get_vec_def_for_operand (iv_def, iv_phi, NULL);
+ /* If the initial value is not of proper type, convert it. */
+ if (!useless_type_conversion_p (vectype, TREE_TYPE (vec_init)))
+ {
+ new_stmt = gimple_build_assign_with_ops
+ (VIEW_CONVERT_EXPR,
+ vect_get_new_vect_var (vectype, vect_simple_var, "vec_iv_"),
+ build1 (VIEW_CONVERT_EXPR, vectype, vec_init), NULL_TREE);
+ vec_init = make_ssa_name (gimple_assign_lhs (new_stmt), new_stmt);
+ gimple_assign_set_lhs (new_stmt, vec_init);
+ new_bb = gsi_insert_on_edge_immediate (loop_preheader_edge (iv_loop),
+ new_stmt);
+ gcc_assert (!new_bb);
+ set_vinfo_for_stmt (new_stmt,
+ new_stmt_vec_info (new_stmt, loop_vinfo, NULL));
+ }
}
else
{