alias.c: Include basic-block.h.
authorJohn Wehle <john@feith.com>
Wed, 25 Oct 2000 05:00:53 +0000 (05:00 +0000)
committerJohn Wehle <wehle@gcc.gnu.org>
Wed, 25 Oct 2000 05:00:53 +0000 (05:00 +0000)
* alias.c: Include basic-block.h.
(loop_p): New function.
(mark_constant_function): Use it.
* Makefile.in (alias.o): Update dependencies.

From-SVN: r37044

gcc/ChangeLog
gcc/Makefile.in
gcc/alias.c

index f557e825df879ea81d9c0e3ce2ffba6abb15db4f..e9e2a1c914409a078dd10bf7ce7856d0058ca4f5 100644 (file)
@@ -1,3 +1,10 @@
+Wed Oct 25 01:02:44 EDT 2000  John Wehle  (john@feith.com)
+
+       * alias.c: Include basic-block.h.
+       (loop_p): New function.
+       (mark_constant_function): Use it.
+       * Makefile.in (alias.o): Update dependencies.
+
 2000-10-24  Aldy Hernandez  <aldyh@redhat.com>
 
        * config/mn10300/mn10300.c (secondary_reload_class): Treat pseudos
index 91eecce6e74d5958d7db71c47d63e200bc75efcd..c7cab3c7aa02f6fd822928d2303c103c6e9813ff 100644 (file)
@@ -1398,8 +1398,8 @@ reorg.o : reorg.c $(CONFIG_H) system.h $(RTL_H) conditions.h hard-reg-set.h \
    $(BASIC_BLOCK_H) $(REGS_H) insn-config.h $(INSN_ATTR_H) insn-flags.h \
    $(RECOG_H) function.h flags.h output.h $(EXPR_H) toplev.h
 alias.o : alias.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h \
-   $(REGS_H) toplev.h output.h $(EXPR_H) insn-flags.h $(GGC_H) function.h \
-   cselib.h $(TREE_H)
+   $(BASIC_BLOCK_H) $(REGS_H) toplev.h output.h $(EXPR_H) insn-flags.h \
+   $(GGC_H) function.h cselib.h $(TREE_H)
 regmove.o : regmove.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
    $(RECOG_H) output.h $(REGS_H) hard-reg-set.h flags.h function.h \
    $(EXPR_H) insn-flags.h $(BASIC_BLOCK_H) toplev.h
index 09c4530398a4a271625c6436d8fd8cccf4f76082..28016d3245a4881d03a18205c8b6168e31dd099c 100644 (file)
@@ -29,6 +29,7 @@ Boston, MA 02111-1307, USA.  */
 #include "expr.h"
 #include "regs.h"
 #include "hard-reg-set.h"
+#include "basic-block.h"
 #include "flags.h"
 #include "output.h"
 #include "toplev.h"
@@ -105,6 +106,8 @@ static int aliases_everything_p         PARAMS ((rtx));
 static int write_dependence_p           PARAMS ((rtx, rtx, int));
 static int nonlocal_mentioned_p         PARAMS ((rtx));
 
+static int loop_p                       PARAMS ((void));
+
 /* Set up all info needed to perform alias analysis on memory references.  */
 
 /* Returns the size in bytes of the mode of X.  */
@@ -1863,6 +1866,96 @@ nonlocal_mentioned_p (x)
   return 0;
 }
 
+/* Return non-zero if a loop (natural or otherwise) is present.
+   Inspired by Depth_First_Search_PP described in:
+
+     Advanced Compiler Design and Implementation
+     Steven Muchnick
+     Morgan Kaufmann, 1997
+
+   and heavily borrowed from flow_depth_first_order_compute.  */
+
+static int
+loop_p ()
+{
+  edge *stack;
+  int *pre;
+  int *post;
+  int sp;
+  int prenum = 1;
+  int postnum = 1;
+  sbitmap visited;
+
+  /* Allocate the preorder and postorder number arrays.  */
+  pre = (int *) xcalloc (n_basic_blocks, sizeof (int));
+  post = (int *) xcalloc (n_basic_blocks, sizeof (int));
+
+  /* Allocate stack for back-tracking up CFG.  */
+  stack = (edge *) xmalloc ((n_basic_blocks + 1) * sizeof (edge));
+  sp = 0;
+
+  /* Allocate bitmap to track nodes that have been visited.  */
+  visited = sbitmap_alloc (n_basic_blocks);
+
+  /* None of the nodes in the CFG have been visited yet.  */
+  sbitmap_zero (visited);
+
+  /* Push the first edge on to the stack.  */
+  stack[sp++] = ENTRY_BLOCK_PTR->succ;
+
+  while (sp)
+    {
+      edge e;
+      basic_block src;
+      basic_block dest;
+
+      /* Look at the edge on the top of the stack.  */
+      e = stack[sp - 1];
+      src = e->src;
+      dest = e->dest;
+
+      /* Check if the edge destination has been visited yet.  */
+      if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
+       {
+         /* Mark that we have visited the destination.  */
+         SET_BIT (visited, dest->index);
+
+         pre[dest->index] = prenum++;
+
+         if (dest->succ)
+           {
+             /* Since the DEST node has been visited for the first
+                time, check its successors.  */
+             stack[sp++] = dest->succ;
+           }
+         else
+           post[dest->index] = postnum++;
+       }
+      else
+       {
+         if (dest != EXIT_BLOCK_PTR
+             && pre[src->index] >= pre[dest->index]
+             && post[dest->index] == 0)
+           break;
+
+         if (! e->succ_next && src != ENTRY_BLOCK_PTR)
+           post[src->index] = postnum++;
+
+         if (e->succ_next)
+           stack[sp - 1] = e->succ_next;
+         else
+           sp--;
+       }
+    }
+
+  free (pre);
+  free (post);
+  free (stack);
+  sbitmap_free (visited);
+
+  return sp;
+}
+
 /* Mark the function if it is constant.  */
 
 void
@@ -1878,6 +1971,10 @@ mark_constant_function ()
       || TYPE_MODE (TREE_TYPE (current_function_decl)) == VOIDmode)
     return;
 
+  /* A loop might not return which counts as a side effect.  */
+  if (loop_p ())
+    return;
+
   nonlocal_mentioned = 0;
 
   init_alias_analysis ();