aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-25 10:22:57 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-25 10:22:57 +0000
commit59ec925b1199f9777d0d10be46251516f774b214 (patch)
tree55f77a216d9ec3e9a34f6aafdd73a26855b05273 /gcc
parent4741b062d65c4af37eba4b1ba5bba11bc95256e1 (diff)
downloadgcc-59ec925b1199f9777d0d10be46251516f774b214.zip
gcc-59ec925b1199f9777d0d10be46251516f774b214.tar.gz
gcc-59ec925b1199f9777d0d10be46251516f774b214.tar.bz2
re PR tree-optimization/78343 (Loop is not eliminated)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/passes.def3
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.dg/autopar/uns-outer-6.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c15
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr38529.c4
-rw-r--r--gcc/tree-ssa-dce.c21
9 files changed, 53 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9e2c4ff..9681566 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/passes.def b/gcc/passes.def
index b730009..1117b8b 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7e1aace..7072950 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c b/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c
index dc2870b..12bd397 100644
--- a/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c
+++ b/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c
@@ -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;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c
index 7cc5404..cda86a7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030808-1.c
@@ -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"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c
index 501e28c..d1a9af8 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20040305-1.c
@@ -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
index 0000000..099b281
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/sccp-2.c
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/pr38529.c b/gcc/testsuite/gcc.dg/vect/pr38529.c
index 171adeb..9b5919d 100644
--- a/gcc/testsuite/gcc.dg/vect/pr38529.c
+++ b/gcc/testsuite/gcc.dg/vect/pr38529.c
@@ -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" } } */
-
-
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 7b9814e..50b5eef 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -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;
}