No functional changes.
gcc/ChangeLog:
* config/xtensa/xtensa.cc
(xtensa_can_eliminate_callee_saved_reg_p):
Change the arguments that return values from being passed by pointer
to C++ reference.
(xtensa_expand_prologue):
Adjust the call to xtensa_can_eliminate_callee_saved_reg_p() to
match the above changes. And also replace some of the individual
coding for RTX rewriting and subsequent DF rescanning with functions
that are already officially provided.
---
gcc/config/xtensa/xtensa.cc | 38 +++++++++++++------------------------
1 file changed, 13 insertions(+), 25 deletions(-)
diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index ed4f0e34661..908590730e0 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -3587,17 +3587,16 @@ xtensa_emit_adjust_stack_ptr (HOST_WIDE_INT offset, int
flags)
static bool
xtensa_can_eliminate_callee_saved_reg_p (unsigned int regno,
- rtx_insn **p_insnS,
- rtx_insn **p_insnR)
+ rtx_insn *&insnS, rtx_insn *&insnR)
{
df_ref ref;
- rtx_insn *insn, *insnS = NULL, *insnR = NULL;
+ rtx_insn *insn;
rtx pattern;
if (!optimize || !df || call_used_or_fixed_reg_p (regno))
return false;
- for (ref = DF_REG_DEF_CHAIN (regno);
+ for (insnS = NULL, ref = DF_REG_DEF_CHAIN (regno);
ref; ref = DF_REF_NEXT_REG (ref))
if (DF_REF_CLASS (ref) != DF_REF_REGULAR
|| DEBUG_INSN_P (insn = DF_REF_INSN (ref)))
@@ -3617,7 +3616,7 @@ xtensa_can_eliminate_callee_saved_reg_p (unsigned int
regno,
else
return false;
- for (ref = DF_REG_USE_CHAIN (regno);
+ for (insnR = NULL, ref = DF_REG_USE_CHAIN (regno);
ref; ref = DF_REF_NEXT_REG (ref))
if (DF_REF_CLASS (ref) != DF_REF_REGULAR
|| DEBUG_INSN_P (insn = DF_REF_INSN (ref)))
@@ -3637,12 +3636,7 @@ xtensa_can_eliminate_callee_saved_reg_p (unsigned int
regno,
else
return false;
- if (!insnS || !insnR)
- return false;
-
- *p_insnS = insnS, *p_insnR = insnR;
-
- return true;
+ return insnS && insnR;
}
/* minimum frame = reg save area (4 words) plus static chain (1 word)
@@ -3745,15 +3739,15 @@ xtensa_expand_prologue (void)
if (!large_stack_needed
&& xtensa_can_eliminate_callee_saved_reg_p (regno,
- &insnS, &insnR))
+ insnS, insnR))
{
if (frame_pointer_needed)
mem = replace_rtx (mem, stack_pointer_rtx,
hard_frame_pointer_rtx);
- SET_DEST (PATTERN (insnS)) = mem;
- df_insn_rescan (insnS);
- SET_SRC (PATTERN (insnR)) = copy_rtx (mem);
- df_insn_rescan (insnR);
+ validate_unshare_change (insnS, &SET_DEST (PATTERN (insnS)),
+ mem, 0);
+ validate_unshare_change (insnR, &SET_SRC (PATTERN (insnR)),
+ mem, 0);
SET_HARD_REG_BIT (cfun->machine->eliminated_callee_saved,
regno);
}
@@ -3788,15 +3782,9 @@ xtensa_expand_prologue (void)
for (insn = first;
insn != cfun->machine->set_frame_ptr_insn;
insn = NEXT_INSN (insn))
- {
- if (INSN_P (insn))
- {
- PATTERN (insn) = replace_rtx (copy_rtx (PATTERN (insn)),
- hard_frame_pointer_rtx,
- stack_pointer_rtx);
- df_insn_rescan (insn);
- }
- }
+ if (INSN_P (insn))
+ validate_replace_rtx (hard_frame_pointer_rtx, stack_pointer_rtx,
+ insn);
}
else
{
--
2.39.5