aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-04-07 14:03:55 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-04-07 14:03:55 +0000
commitd6adff07f12460e7c6de668c40d0fafabe737051 (patch)
tree839f5648f4c5fbe2a97503797ffa6be8596a1707 /gcc
parent9d7aea5fbc096600902e28e3203d67379f301f2b (diff)
downloadgcc-d6adff07f12460e7c6de668c40d0fafabe737051.zip
gcc-d6adff07f12460e7c6de668c40d0fafabe737051.tar.gz
gcc-d6adff07f12460e7c6de668c40d0fafabe737051.tar.bz2
re PR tree-optimization/60766 (Wrong optimization with -O2)
2014-04-07 Richard Biener <rguenther@suse.de> PR tree-optimization/60766 * tree-ssa-loop-ivopts.c (cand_value_at): Compute in an unsigned type. (may_eliminate_iv): Convert cand_value_at result to desired type. * gcc.dg/torture/pr60766.c: New testcase. From-SVN: r209190
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr60766.c15
-rw-r--r--gcc/tree-ssa-loop-ivopts.c9
4 files changed, 35 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3cde1e..b7743c7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2014-04-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60766
+ * tree-ssa-loop-ivopts.c (cand_value_at): Compute in an
+ unsigned type.
+ (may_eliminate_iv): Convert cand_value_at result to desired
+ type.
+
2014-04-07 Jason Merrill <jason@redhat.com>
PR c++/60731
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4b25290..a75405d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-04-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60766
+ * gcc.dg/torture/pr60766.c: New testcase.
+
2014-04-07 Jason Merrill <jason@redhat.com>
* lib/gcc-dg.exp (dg-build-dso): New.
diff --git a/gcc/testsuite/gcc.dg/torture/pr60766.c b/gcc/testsuite/gcc.dg/torture/pr60766.c
new file mode 100644
index 0000000..6f16e3b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr60766.c
@@ -0,0 +1,15 @@
+/* { dg-do run } */
+
+int m = 9;
+
+int main()
+{
+ int n, x;
+
+ n = m;
+ for (x = 0; x <= n; x++)
+ if (n == x + (x + 1) + (x + 2))
+ return 0;
+
+ __builtin_abort();
+}
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 14ba20f..8bc4e8f 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -4363,8 +4363,10 @@ cand_value_at (struct loop *loop, struct iv_cand *cand, gimple at, tree niter,
tree steptype = type;
if (POINTER_TYPE_P (type))
steptype = sizetype;
+ steptype = unsigned_type_for (type);
- tree_to_aff_combination (iv->step, steptype, &step);
+ tree_to_aff_combination (iv->step, TREE_TYPE (iv->step), &step);
+ aff_combination_convert (&step, steptype);
tree_to_aff_combination (niter, TREE_TYPE (niter), &nit);
aff_combination_convert (&nit, steptype);
aff_combination_mult (&nit, &step, &delta);
@@ -4372,6 +4374,8 @@ cand_value_at (struct loop *loop, struct iv_cand *cand, gimple at, tree niter,
aff_combination_add (&delta, &step);
tree_to_aff_combination (iv->base, type, val);
+ if (!POINTER_TYPE_P (type))
+ aff_combination_convert (val, steptype);
aff_combination_add (val, &delta);
}
@@ -4750,7 +4754,8 @@ may_eliminate_iv (struct ivopts_data *data,
cand_value_at (loop, cand, use->stmt, desc->niter, &bnd);
- *bound = aff_combination_to_tree (&bnd);
+ *bound = fold_convert (TREE_TYPE (cand->iv->base),
+ aff_combination_to_tree (&bnd));
*comp = iv_elimination_compare (data, use);
/* It is unlikely that computing the number of iterations using division