aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2010-02-11 15:45:27 +0000
committerSebastian Pop <spop@gcc.gnu.org>2010-02-11 15:45:27 +0000
commit04eadb13265b69db0282da8803f13e357a129079 (patch)
tree816517506e1c41ef333a3003809df242999218a4 /gcc
parent91753e21c33ee0f333e529487d67a1ff60b30655 (diff)
downloadgcc-04eadb13265b69db0282da8803f13e357a129079.zip
gcc-04eadb13265b69db0282da8803f13e357a129079.tar.gz
gcc-04eadb13265b69db0282da8803f13e357a129079.tar.bz2
re PR regression/40886 (No loop counter reversal for simple loops anymore)
Fix PR40886. 2010-02-11 Sebastian Pop <sebastian.pop@amd.com> Changpeng Fang <changpeng.fang@amd.com> PR middle-end/40886 * tree-ssa-loop-ivopts.c (determine_use_iv_cost_condition): Decrement the cost of an IV candidate when the IV is used in a test against zero. * gcc.dg/tree-ssa/ivopts-3.c: New. Co-Authored-By: Changpeng Fang <changpeng.fang@amd.com> From-SVN: r156701
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ivopts-3.c12
-rw-r--r--gcc/tree-ssa-loop-ivopts.c15
3 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70deed7..52d1a1a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2010-02-11 Sebastian Pop <sebastian.pop@amd.com>
+ Changpeng Fang <changpeng.fang@amd.com>
+
+ PR middle-end/40886
+ * tree-ssa-loop-ivopts.c (determine_use_iv_cost_condition): Decrement
+ the cost of an IV candidate when the IV is used in a test against zero.
+
+ * gcc.dg/tree-ssa/ivopts-3.c: New.
+
2010-02-11 Richard Guenther <rguenther@suse.de>
PR lto/41664
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-3.c
new file mode 100644
index 0000000..7c4236b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-3.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ivopts-details" } */
+
+void main (void)
+{
+ int i;
+ for (i = 0; i < 10; i++)
+ f2 ();
+}
+
+/* { dg-final { scan-tree-dump-times "!= 0" 4 "ivopts" } } */
+/* { dg-final { cleanup-tree-dump "ivopts" } } */
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 436e6ce..74dadf7 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -4089,6 +4089,7 @@ determine_use_iv_cost_condition (struct ivopts_data *data,
bitmap depends_on_elim = NULL, depends_on_express = NULL, depends_on;
comp_cost elim_cost, express_cost, cost;
bool ok;
+ tree *control_var, *bound_cst;
/* Only consider real candidates. */
if (!cand->iv)
@@ -4110,9 +4111,21 @@ determine_use_iv_cost_condition (struct ivopts_data *data,
/* Try expressing the original giv. If it is compared with an invariant,
note that we cannot get rid of it. */
- ok = extract_cond_operands (data, use->stmt, NULL, NULL, NULL, &cmp_iv);
+ ok = extract_cond_operands (data, use->stmt, &control_var, &bound_cst,
+ NULL, &cmp_iv);
gcc_assert (ok);
+ /* When the condition is a comparison of the candidate IV against
+ zero, prefer this IV.
+
+ TODO: The constant that we're substracting from the cost should
+ be target-dependent. This information should be added to the
+ target costs for each backend. */
+ if (integer_zerop (*bound_cst)
+ && (operand_equal_p (*control_var, cand->var_after, 0)
+ || operand_equal_p (*control_var, cand->var_before, 0)))
+ elim_cost.cost -= 1;
+
express_cost = get_computation_cost (data, use, cand, false,
&depends_on_express, NULL);
fd_ivopts_data = data;