re PR tree-optimization/78343 (Loop is not eliminated)
authorRichard Biener <rguenther@suse.de>
Fri, 25 Nov 2016 10:22:57 +0000 (10:22 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 25 Nov 2016 10:22:57 +0000 (10:22 +0000)
2016-11-24  Richard Biener  <rguenther@suse.de>

PR tree-optimization/78343
* passes.def: Add CD-DCE pass after loop splitting.
* tree-ssa-dce.c (find_obviously_necessary_stmts): Move
SCEV init/finalize ...
(perform_tree_ssa_dce): ... here.  Deal with being
executed inside the loop pipeline in aggressive mode.

* gcc.dg/tree-ssa/sccp-2.c: New testcase.
* gcc.dg/autopar/uns-outer-6.c: Adjust.
* gcc.dg/tree-ssa/20030808-1.c: Likewise.
* gcc.dg/tree-ssa/20040305-1.c: Likewise.
* gcc.dg/vect/pr38529.c: Likewise.

From-SVN: r242872

gcc/ChangeLog
gcc/passes.def
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/autopar/uns-outer-6.c
gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c
gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c
gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr38529.c
gcc/tree-ssa-dce.c

index 9e2c4ff..9681566 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-24  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/78343
+       * passes.def: Add CD-DCE pass after loop splitting.
+       * tree-ssa-dce.c (find_obviously_necessary_stmts): Move
+       SCEV init/finalize ...
+       (perform_tree_ssa_dce): ... here.  Deal with being
+       executed inside the loop pipeline in aggressive mode.
+
 2016-11-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * tree-ssa-math-opts.c (struct symbolic_number): Improve comment.
index b730009..1117b8b 100644 (file)
@@ -272,6 +272,9 @@ along with GCC; see the file COPYING3.  If not see
          NEXT_PASS (pass_tree_unswitch);
          NEXT_PASS (pass_scev_cprop);
          NEXT_PASS (pass_loop_split);
+         /* All unswitching, final value replacement and splitting can expose
+            empty loops.  Remove them now.  */
+         NEXT_PASS (pass_cd_dce);
          NEXT_PASS (pass_record_bounds);
          NEXT_PASS (pass_loop_distribution);
          NEXT_PASS (pass_copy_prop);
index 7e1aace..7072950 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-24  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/78343
+       * gcc.dg/tree-ssa/sccp-2.c: New testcase.
+       * gcc.dg/autopar/uns-outer-6.c: Adjust.
+       * gcc.dg/tree-ssa/20030808-1.c: Likewise.
+       * gcc.dg/tree-ssa/20040305-1.c: Likewise.
+       * gcc.dg/vect/pr38529.c: Likewise.
+
 2016-11-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        PR tree-optimization/77673
index dc2870b..12bd397 100644 (file)
@@ -25,7 +25,7 @@ parloop (int N)
   for (i = 0; i < N; i++)
     {
       for (j = 0; j < N; j++)
-       y[i]=x[i][j];
+       y[i] += x[i][j];
       sum += y[i];
     }
   g_sum = sum;
index 7cc5404..cda86a7 100644 (file)
@@ -33,8 +33,8 @@ delete_dead_jumptables ()
 /* There should be no loads of ->code.  If any exist, then we failed to
    optimize away all the IF statements and the statements feeding
    their conditions.  */
-/* { dg-final { scan-tree-dump-times "->code" 0 "cddce2"} } */
+/* { dg-final { scan-tree-dump-times "->code" 0 "cddce3"} } */
    
 /* There should be no IF statements.  */
-/* { dg-final { scan-tree-dump-times "if " 0 "cddce2"} } */
+/* { dg-final { scan-tree-dump-times "if " 0 "cddce3"} } */
 
index 501e28c..d1a9af8 100644 (file)
@@ -27,4 +27,4 @@ void foo(int edx, int eax)
 
 /* After cddce we should have two IF statements remaining as the other
    two tests can be threaded.  */
-/* { dg-final { scan-tree-dump-times "if " 2 "cddce2"} } */
+/* { dg-final { scan-tree-dump-times "if " 2 "cddce3"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c b/gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c
new file mode 100644 (file)
index 0000000..099b281
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+unsigned int
+test(unsigned int quant)
+{
+  unsigned int sum = 0;
+  for (unsigned int i = 0; i < quant; ++i)
+    sum += quant;
+  return sum;
+}
+
+/* A single basic-block should remain (computing and
+   returning quant * quant).  */
+/* { dg-final { scan-tree-dump-times "bb" 1 "optimized" } } */
index 171adeb..9b5919d 100644 (file)
@@ -11,7 +11,3 @@ void foo()
     for (j = 0; j < 17; ++j)
       a[i] = 0;
 }
-
-/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect"  } } */
-
-
index 7b9814e..50b5eef 100644 (file)
@@ -400,7 +400,6 @@ find_obviously_necessary_stmts (bool aggressive)
   if (aggressive)
     {
       struct loop *loop;
-      scev_initialize ();
       if (mark_irreducible_loops ())
        FOR_EACH_BB_FN (bb, cfun)
          {
@@ -423,7 +422,6 @@ find_obviously_necessary_stmts (bool aggressive)
              fprintf (dump_file, "can not prove finiteness of loop %i\n", loop->num);
            mark_control_dependent_edges_necessary (loop->latch, false);
          }
-      scev_finalize ();
     }
 }
 
@@ -1567,9 +1565,13 @@ perform_tree_ssa_dce (bool aggressive)
   /* Preheaders are needed for SCEV to work.
      Simple lateches and recorded exits improve chances that loop will
      proved to be finite in testcases such as in loop-15.c and loop-24.c  */
-  if (aggressive)
-    loop_optimizer_init (LOOPS_NORMAL
-                        | LOOPS_HAVE_RECORDED_EXITS);
+  bool in_loop_pipeline = scev_initialized_p ();
+  if (aggressive && ! in_loop_pipeline)
+    {
+      scev_initialize ();
+      loop_optimizer_init (LOOPS_NORMAL
+                          | LOOPS_HAVE_RECORDED_EXITS);
+    }
 
   tree_dce_init (aggressive);
 
@@ -1588,8 +1590,11 @@ perform_tree_ssa_dce (bool aggressive)
 
   find_obviously_necessary_stmts (aggressive);
 
-  if (aggressive)
-    loop_optimizer_finalize ();
+  if (aggressive && ! in_loop_pipeline)
+    {
+      loop_optimizer_finalize ();
+      scev_finalize ();
+    }
 
   longest_chain = 0;
   total_chain = 0;
@@ -1623,7 +1628,7 @@ perform_tree_ssa_dce (bool aggressive)
   if (something_changed)
     {
       free_numbers_of_iterations_estimates (cfun);
-      if (scev_initialized_p ())
+      if (in_loop_pipeline)
        scev_reset ();
       return TODO_update_ssa | TODO_cleanup_cfg;
     }