From 18eb76ebfa25806dab9a23e726f1d8f914c51630 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Wed, 5 Sep 2012 13:29:13 +0000
Subject: [PATCH] re PR tree-optimization/46590 (long compile time with -O2 and
 many loops)

2012-09-05  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/46590
	* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Do not
	update SSA form here.
	(canonicalize_induction_variables): Assert we do not need to
	update SSA form.
	(tree_unroll_loops_completely): Update SSA form here.
	* tree-ssa-loop-manip.c (gimple_duplicate_loop_to_header_edge):
	Do not verify loop-closed SSA form if SSA form is not up-to-date.

From-SVN: r190978
---
 gcc/ChangeLog               | 11 +++++++++++
 gcc/tree-ssa-loop-ivcanon.c |  4 +++-
 gcc/tree-ssa-loop-manip.c   |  8 +++++++-
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9866362b50b4..33a8dfd2c7f8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2012-09-05  Richard Guenther  <rguenther@suse.de>
+
+	PR tree-optimization/46590
+	* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Do not
+	update SSA form here.
+	(canonicalize_induction_variables): Assert we do not need to
+	update SSA form.
+	(tree_unroll_loops_completely): Update SSA form here.
+	* tree-ssa-loop-manip.c (gimple_duplicate_loop_to_header_edge):
+	Do not verify loop-closed SSA form if SSA form is not up-to-date.
+
 2012-09-05  Georg-Johann Lay  <avr@gjlay.de>
 
 	PR target/54461
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
index 48fd3f4425b3..e1584b44e93e 100644
--- a/gcc/tree-ssa-loop-ivcanon.c
+++ b/gcc/tree-ssa-loop-ivcanon.c
@@ -414,7 +414,6 @@ try_unroll_loop_completely (struct loop *loop,
   else
     gimple_cond_make_false (cond);
   update_stmt (cond);
-  update_ssa (TODO_update_ssa);
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     fprintf (dump_file, "Unrolled loop %d completely.\n", loop->num);
@@ -493,6 +492,7 @@ canonicalize_induction_variables (void)
 							true, UL_SINGLE_ITER,
 							true);
     }
+  gcc_assert (!need_ssa_update_p (cfun));
 
   /* Clean up the information about numbers of iterations, since brute force
      evaluation could reveal new information.  */
@@ -536,6 +536,8 @@ tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer)
 
       if (changed)
 	{
+	  update_ssa (TODO_update_ssa);
+
 	  /* This will take care of removing completely unrolled loops
 	     from the loop structures so we can continue unrolling now
 	     innermost loops.  */
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index 832a5011493f..9732fbe484a8 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -752,7 +752,13 @@ gimple_duplicate_loop_to_header_edge (struct loop *loop, edge e,
     return false;
 
 #ifdef ENABLE_CHECKING
-  if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
+  /* ???  This forces needless update_ssa calls after processing each
+     loop instead of just once after processing all loops.  We should
+     instead verify that loop-closed SSA form is up-to-date for LOOP
+     only (and possibly SSA form).  For now just skip verifying if
+     there are to-be renamed variables.  */
+  if (!need_ssa_update_p (cfun)
+      && loops_state_satisfies_p (LOOP_CLOSED_SSA))
     verify_loop_closed_ssa (true);
 #endif
 
-- 
GitLab