From b1483e87c9e95b7950571b7eff59643985480c39 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Sat, 14 Apr 2007 20:52:45 +0200
Subject: [PATCH] re PR c++/25874 ([gomp]  ICE in calc_dfs_tree())

	PR c++/25874
	* omp-low.c (expand_omp_parallel): If child_cfun->cfg, free dominators,
	post dominators and cleanup cfg before returning.

	* gcc.dg/gomp/pr25874.c: Add dg-options.
	* g++.dg/gomp/pr25874.C: Add dg-options.

From-SVN: r123822
---
 gcc/ChangeLog                       |  6 ++++++
 gcc/omp-low.c                       | 10 ++++++++++
 gcc/testsuite/ChangeLog             |  6 ++++++
 gcc/testsuite/g++.dg/gomp/pr25874.C |  2 ++
 gcc/testsuite/gcc.dg/gomp/pr25874.c |  2 ++
 5 files changed, 26 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 016c62ade409..c564780fe1f3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-14  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/25874
+	* omp-low.c (expand_omp_parallel): If child_cfun->cfg, free dominators,
+	post dominators and cleanup cfg before returning.
+
 2007-04-14  Bernd Schmidt  <bernd.schmidt@analog.com>
 
 	* config/bfin/bfin.h (MODES_TIEABLE_P): Allow more modes to be tied.
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index f176f9e41021..5715812c2dc9 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -2409,6 +2409,7 @@ expand_omp_parallel (struct omp_region *region)
   block_stmt_iterator si;
   tree entry_stmt;
   edge e;
+  bool do_cleanup_cfg = false;
 
   entry_stmt = last_stmt (region->entry);
   child_fn = OMP_PARALLEL_FN (entry_stmt);
@@ -2444,6 +2445,7 @@ expand_omp_parallel (struct omp_region *region)
 	  exit_succ_e = single_succ_edge (exit_bb);
 	  make_edge (new_bb, exit_succ_e->dest, EDGE_FALLTHRU);
 	}
+      do_cleanup_cfg = true;
     }
   else
     {
@@ -2537,6 +2539,14 @@ expand_omp_parallel (struct omp_region *region)
 
   /* Emit a library call to launch the children threads.  */
   expand_parallel_call (region, new_bb, entry_stmt, ws_args);
+
+  if (do_cleanup_cfg)
+    {
+      /* Clean up the unreachable sub-graph we created above.  */
+      free_dominance_info (CDI_DOMINATORS);
+      free_dominance_info (CDI_POST_DOMINATORS);
+      cleanup_tree_cfg ();
+    }
 }
 
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 29ee918ee374..2d2c891a366f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-14  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/25874
+	* gcc.dg/gomp/pr25874.c: Add dg-options.
+	* g++.dg/gomp/pr25874.C: Add dg-options.
+
 2007-04-14  Bernhard Fischer  <aldot@gcc.gnu.org>
 	
 	PR fortran/21061
diff --git a/gcc/testsuite/g++.dg/gomp/pr25874.C b/gcc/testsuite/g++.dg/gomp/pr25874.C
index 02adef97f568..83573f10a573 100644
--- a/gcc/testsuite/g++.dg/gomp/pr25874.C
+++ b/gcc/testsuite/g++.dg/gomp/pr25874.C
@@ -1,3 +1,5 @@
+// { dg-options "-O -fopenmp" }
+
 int foo();
 
 struct wigner_d
diff --git a/gcc/testsuite/gcc.dg/gomp/pr25874.c b/gcc/testsuite/gcc.dg/gomp/pr25874.c
index 568e1f04f884..2afd02ea326c 100644
--- a/gcc/testsuite/gcc.dg/gomp/pr25874.c
+++ b/gcc/testsuite/gcc.dg/gomp/pr25874.c
@@ -1,3 +1,5 @@
+/* { dg-options "-O -fopenmp" } */
+
 void foo();
 
 inline void bar()
-- 
GitLab