Commit 94f24ddc by Zdenek Dvorak Committed by Zdenek Dvorak

alias.c (find_base_term): Export.

	* 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
parent 92441f83
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
......
......@@ -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;
{
......
......@@ -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;
}
......
......@@ -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 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment