This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, PR rtl-optimization/71148] Avoid cleanup_cfg called with invalidated dominance info


Hi,

This patch resolves PR71148 by releasing dominance info before
cleanup_cfg calls to avoid attempts to fixup invalid dominance
info.

Dominance info handling in cleanup_cfg looks weird though.  It
tries to fix it but can invalidate it at the same time (PR71084).
We should probably do something with that.

Tracker is P1 and this patch may be OK solution for now.

Bootstrapped and regtested on x86_64-pc-linux-gnu.  Ok for trunk?

Thanks,
Ilya
--
gcc/

2016-05-18  Ilya Enkovich  <ilya.enkovich@intel.com>

	PR rtl-optimization/71148
	* cse.c (rest_of_handle_cse): Free dominance info
	before cleanup_cfg call if required.
	(rest_of_handle_cse2): Likewise.
	(rest_of_handle_cse_after_global_opts): Likewise.

gcc/testsuite/

2016-05-18  Ilya Enkovich  <ilya.enkovich@intel.com>

	PR rtl-optimization/71148
	* gcc.dg/pr71148.c: New test.


diff --git a/gcc/cse.c b/gcc/cse.c
index 322e352..4aa4443 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -7558,6 +7558,12 @@ rest_of_handle_cse (void)
      expecting CSE to be run.  But always rerun it in a cheap mode.  */
   cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
 
+  /* Check if we need to free dominance info before cleanup_cfg
+     because it may become really slow in case of invalid
+     dominance info.  */
+  if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+    free_dominance_info (CDI_DOMINATORS);
+
   if (tem == 2)
     {
       timevar_push (TV_JUMP);
@@ -7630,6 +7636,12 @@ rest_of_handle_cse2 (void)
 
   delete_trivially_dead_insns (get_insns (), max_reg_num ());
 
+  /* Check if we need to free dominance info before cleanup_cfg
+     because it may become really slow in case of invalid
+     dominance info.  */
+  if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+    free_dominance_info (CDI_DOMINATORS);
+
   if (tem == 2)
     {
       timevar_push (TV_JUMP);
@@ -7706,6 +7718,12 @@ rest_of_handle_cse_after_global_opts (void)
 
   cse_not_expected = !flag_rerun_cse_after_loop;
 
+  /* Check if we need to free dominance info before cleanup_cfg
+     because it may become really slow in case of invalid
+     dominance info.  */
+  if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+    free_dominance_info (CDI_DOMINATORS);
+
   /* If cse altered any jumps, rerun jump opts to clean things up.  */
   if (tem == 2)
     {
diff --git a/gcc/testsuite/gcc.dg/pr71148.c b/gcc/testsuite/gcc.dg/pr71148.c
new file mode 100644
index 0000000..6aa4920
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr71148.c
@@ -0,0 +1,46 @@
+/* PR rtl-optimization/71148 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -funroll-loops" } */
+
+int rh, ok, kq, fu;
+
+void
+js (int cs)
+{
+  rh = fu;
+  if (fu != 0)
+    {
+      cs /= 3;
+      if (cs <= 0)
+        {
+          int z9;
+          for (z9 = 0; z9 < 2; ++z9)
+            {
+              z9 += cs;
+              ok += z9;
+              fu += ok;
+            }
+        }
+    }
+}
+
+void
+vy (int s3)
+{
+  int yo, g2 = 0;
+ sd:
+  js (g2);
+  for (yo = 0; yo < 2; ++yo)
+    {
+      if (fu != 0)
+        goto sd;
+      kq += (s3 != (g2 ? s3 : 0));
+      for (s3 = 0; s3 < 72; ++s3)
+        g2 *= (~0 - 1);
+      g2 -= yo;
+    }
+  for (fu = 0; fu < 18; ++fu)
+    for (yo = 0; yo < 17; ++yo)
+      if (g2 < 0)
+        goto sd;
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]