re PR tree-optimization/84512 (Missed optimization: should be precalculated in compil...
authorRichard Biener <rguenther@suse.de>
Tue, 27 Feb 2018 15:25:33 +0000 (15:25 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 27 Feb 2018 15:25:33 +0000 (15:25 +0000)
2018-02-27  Richard Biener  <rguenther@suse.de>

PR tree-optimization/84512
* tree-vect-loop.c (vect_compute_single_scalar_iteration_cost):
Do not use the estimate returned from record_stmt_cost for
the scalar iteration cost but sum properly using add_stmt_cost.

* gcc.dg/tree-ssa/pr84512.c: New testcase.

From-SVN: r258036

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

index d4e56b3bd9b15238244a6c0dc0d070e32766f682..d56af0f7363348a584ff0ef3c2e904c818c10094 100644 (file)
@@ -1,3 +1,10 @@
+2018-02-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84512
+       * tree-vect-loop.c (vect_compute_single_scalar_iteration_cost):
+       Do not use the estimate returned from record_stmt_cost for
+       the scalar iteration cost but sum properly using add_stmt_cost.
+
 2018-02-27  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/84466
index 6506d8f4c6be0ece69b9250d832572547a36be43..5431093d456edb407f3fbb6af29bd0dabf428a4e 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84512
+       * gcc.dg/tree-ssa/pr84512.c: New testcase.
+
 2018-02-27  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/84548
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84512.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84512.c
new file mode 100644 (file)
index 0000000..288fa5d
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-optimized" } */
+
+int foo()
+{
+  int a[10];
+  for(int i = 0; i < 10; ++i)
+    a[i] = i*i;
+  int res = 0;
+  for(int i = 0; i < 10; ++i)
+    res += a[i];
+  return res;
+}
+
+/* { dg-final { scan-tree-dump "return 285;" "optimized" } } */
index 3a5114748131a6fdeb73ea1767612144960ea7ee..6585c85cfe039465cbe850926787a34af6cc079a 100644 (file)
@@ -1384,16 +1384,10 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
 {
   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
   basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
-  int nbbs = loop->num_nodes, factor, scalar_single_iter_cost = 0;
+  int nbbs = loop->num_nodes, factor;
   int innerloop_iters, i;
 
-  /* Count statements in scalar loop.  Using this as scalar cost for a single
-     iteration for now.
-
-     TODO: Add outer loop support.
-
-     TODO: Consider assigning different costs to different scalar
-     statements.  */
+  /* Gather costs for statements in the scalar loop.  */
 
   /* FORNOW.  */
   innerloop_iters = 1;
@@ -1437,13 +1431,28 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
           else
             kind = scalar_stmt;
 
-         scalar_single_iter_cost
-           += record_stmt_cost (&LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo),
-                                factor, kind, stmt_info, 0, vect_prologue);
+         record_stmt_cost (&LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo),
+                           factor, kind, stmt_info, 0, vect_prologue);
         }
     }
-  LOOP_VINFO_SINGLE_SCALAR_ITERATION_COST (loop_vinfo)
-    = scalar_single_iter_cost;
+
+  /* Now accumulate cost.  */
+  void *target_cost_data = init_cost (loop);
+  stmt_info_for_cost *si;
+  int j;
+  FOR_EACH_VEC_ELT (LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo),
+                   j, si)
+    {
+      struct _stmt_vec_info *stmt_info
+       = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+      (void) add_stmt_cost (target_cost_data, si->count,
+                           si->kind, stmt_info, si->misalign,
+                           vect_body);
+    }
+  unsigned dummy, body_cost = 0;
+  finish_cost (target_cost_data, &dummy, &body_cost, &dummy);
+  destroy_cost_data (target_cost_data);
+  LOOP_VINFO_SINGLE_SCALAR_ITERATION_COST (loop_vinfo) = body_cost;
 }