gcse.c (gcse_main): Avoid global optimizations if we have a large number of basic...
authorJeffrey A Law <law@cygnus.com>
Sun, 10 Oct 1999 05:30:28 +0000 (05:30 +0000)
committerJeff Law <law@gcc.gnu.org>
Sun, 10 Oct 1999 05:30:28 +0000 (23:30 -0600)
        * gcse.c (gcse_main): Avoid global optimizations if we have a
        large number of basic blocks and the ratio of edges to blocks
        is high.
        (delete_null_pointer_checks): Likewise.

From-SVN: r29882

gcc/ChangeLog
gcc/gcse.c

index da2340a..3401253 100644 (file)
@@ -1,3 +1,10 @@
+Sat Oct  9 23:26:55 1999  Jeffrey A Law  (law@cygnus.com)
+
+        * gcse.c (gcse_main): Avoid global optimizations if we have a
+        large number of basic blocks and the ratio of edges to blocks
+        is high.
+        (delete_null_pointer_checks): Likewise.
+
 Sat Oct  9 23:16:01 1999  Ken Raeburn  <raeburn@mit.edu>
 
        * c-common.c (check_format_info): Warn if format string isn't a
index def3489..cc9d266 100644 (file)
@@ -672,6 +672,21 @@ gcse_main (f, file)
       return 0;
     }
 
+  /* Trying to perform global optimizations on flow graphs which have
+     a high connectivity will take a long time and is unlikely to be
+     particularly useful.
+
+     In normal circumstances a cfg should have about twice has many edges
+     as blocks.  But we do not want to punish small functions which have
+     a couple switch statements.  So we require a relatively large number
+     of basic blocks and the ratio of edges to blocks to be high.  */
+  if (n_basic_blocks > 1000 && n_edges / n_basic_blocks >= 20)
+    {
+      /* Free storage allocated by find_basic_blocks.  */
+      free_basic_block_vars (0);
+      return 0;
+    }
+
   /* See what modes support reg/reg copy operations.  */
   if (! can_copy_init_p)
     {
@@ -4908,6 +4923,21 @@ delete_null_pointer_checks (f)
       return;
     }
 
+  /* Trying to perform global optimizations on flow graphs which have
+     a high connectivity will take a long time and is unlikely to be
+     particularly useful.
+
+     In normal circumstances a cfg should have about twice has many edges
+     as blocks.  But we do not want to punish small functions which have
+     a couple switch statements.  So we require a relatively large number
+     of basic blocks and the ratio of edges to blocks to be high.  */
+  if (n_basic_blocks > 1000 && n_edges / n_basic_blocks >= 20)
+    {
+      /* Free storage allocated by find_basic_blocks.  */
+      free_basic_block_vars (0);
+      return 0;
+    }
+
   /* We need predecessor/successor lists as well as pred/succ counts for
      each basic block.  */
   s_preds = (int_list_ptr *) alloca (n_basic_blocks * sizeof (int_list_ptr));