]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR regression/40886 (No loop counter reversal for simple loops anymore)
authorSebastian Pop <sebastian.pop@amd.com>
Thu, 11 Feb 2010 15:45:27 +0000 (15:45 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Thu, 11 Feb 2010 15:45:27 +0000 (15:45 +0000)
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

gcc/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ivopts-3.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivopts.c

index 70deed75ece3785e544cadb1abe48713554da820..52d1a1abc4a9fd39f47f20c6142655e56632389b 100644 (file)
@@ -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 (file)
index 0000000..7c4236b
--- /dev/null
@@ -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" } }  */
index 436e6ce8fc47cf37bdfcf751f2f3a5613a795604..74dadf77897935c971eb9646ee50b9c12476a956 100644 (file)
@@ -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;