From e004f2f76e03ff21d9c834302098db16133ed3b9 Mon Sep 17 00:00:00 2001 From: John Wehle Date: Wed, 25 Oct 2000 05:00:53 +0000 Subject: [PATCH] alias.c: Include basic-block.h. * 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 | 7 ++++ gcc/Makefile.in | 4 +- gcc/alias.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f557e825df8..e9e2a1c9144 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 * config/mn10300/mn10300.c (secondary_reload_class): Treat pseudos diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 91eecce6e74..c7cab3c7aa0 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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 diff --git a/gcc/alias.c b/gcc/alias.c index 09c4530398a..28016d3245a 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -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 (); -- 2.30.2