alias.c (find_base_term): Export.
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Sat, 5 Apr 2003 15:57:40 +0000 (17:57 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sat, 5 Apr 2003 15:57:40 +0000 (15:57 +0000)
* alias.c (find_base_term): Export.
* rtl.h (find_base_term): Declare.
* gcse.c (find_moveable_store): Test for flag_non_call_exceptions
instead of flag_exceptions.  Move test for parameter passing ...
(store_killed_in_insn): ... here.

From-SVN: r65272

gcc/ChangeLog
gcc/alias.c
gcc/gcse.c
gcc/rtl.h

index 02c2e4c79614646201edd5379c9b61170b67394c..8e3c2295ff1259f532e37c41a2d942173efc1622 100644 (file)
@@ -1,3 +1,11 @@
+2003-04-05  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       * alias.c (find_base_term): Export.
+       * rtl.h (find_base_term): Declare.
+       * gcse.c (find_moveable_store): Test for flag_non_call_exceptions
+       instead of flag_exceptions.  Move test for parameter passing ...
+       (store_killed_in_insn): ... here.
+
 2003-04-05  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
        PR bootstrap/10267
index ba8fceec298402e8a93ebbd86be7330dacc1ff33..49b53c9b5d79c1845855f25d32f290aa2152b2c7 100644 (file)
@@ -98,7 +98,6 @@ rtx get_addr                          PARAMS ((rtx));
 static int memrefs_conflict_p          PARAMS ((int, rtx, int, rtx,
                                                 HOST_WIDE_INT));
 static void record_set                 PARAMS ((rtx, rtx, void *));
-static rtx find_base_term              PARAMS ((rtx));
 static int base_alias_check            PARAMS ((rtx, rtx, enum machine_mode,
                                                 enum machine_mode));
 static rtx find_base_value             PARAMS ((rtx));
@@ -1299,7 +1298,7 @@ find_symbolic_term (x)
   return 0;
 }
 
-static rtx
+rtx
 find_base_term (x)
      rtx x;
 {
index 5cd55adbf175a43f1188e61327a1a4a6d5dfe24a..3460a0c7cecb353e07e92e79758efb48b179638e 100644 (file)
@@ -7148,19 +7148,9 @@ find_moveable_store (insn, regs_set_before, regs_set_after)
   /* If we are handling exceptions, we must be careful with memory references
      that may trap. If we are not, the behavior is undefined, so we may just
      continue.  */
-  if (flag_exceptions && may_trap_p (dest))
+  if (flag_non_call_exceptions && may_trap_p (dest))
     return;
     
-  /* Do not consider MEMs that mention stack pointer; in the following
-     we rely on that constant functions do not read memory, which of course
-     does not include their arguments if passed on stack.
-     
-     Note that this is not quite correct -- we may use other registers
-     to address stack.  See store_killed_in_insn for handling of this
-     case.  */
-  if (reg_mentioned_p (stack_pointer_rtx, dest))
-    return;
-
   ptr = ldst_entry (dest);
   if (!ptr->pattern_regs)
     ptr->pattern_regs = extract_mentioned_regs (dest);
@@ -7411,6 +7401,8 @@ static bool
 store_killed_in_insn (x, x_regs, insn)
      rtx x, x_regs, insn;
 {
+  rtx reg, base;
+
   if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
     return false;
 
@@ -7421,11 +7413,17 @@ store_killed_in_insn (x, x_regs, insn)
       if (! CONST_OR_PURE_CALL_P (insn) || pure_call_p (insn))
        return true;
 
-      /* But even a const call reads its parameters.  It is not trivial
-        check that base of the mem is not related to stack pointer,
-        so unless it contains no registers, just assume it may.  */
-      if (x_regs)
-       return true;
+      /* But even a const call reads its parameters.  Check whether the
+        base of some of registers used in mem is stack pointer.  */
+      for (reg = x_regs; reg; reg = XEXP (reg, 1))
+       {
+         base = find_base_term (reg);
+         if (!base
+             || (GET_CODE (base) == ADDRESS
+                 && GET_MODE (base) == Pmode
+                 && XEXP (base, 0) == stack_pointer_rtx))
+           return true;
+       }
 
       return false;
     }
index c03172bc39042d3b1855a154cdf4cb56cb2be327..b874d6410fe2512003984219cef42b3e05b22ddc 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2282,6 +2282,7 @@ extern void init_alias_analysis           PARAMS ((void));
 extern void end_alias_analysis         PARAMS ((void));
 extern rtx addr_side_effect_eval       PARAMS ((rtx, int, int));
 extern bool memory_modified_in_insn_p  PARAMS ((rtx, rtx));
+extern rtx find_base_term              PARAMS ((rtx));
 
 /* In sibcall.c */
 typedef enum {