mirror of git://gcc.gnu.org/git/gcc.git
rs6000.c (START_USE, [...]): Define.
* config/rs6000/rs6000.c (START_USE, END_USE, NOT_INUSE): Define. (rs6000_emit_prologue): Use the above to catch register overlap. From-SVN: r186798
This commit is contained in:
parent
544055ae65
commit
c344e2656a
|
@ -1,3 +1,8 @@
|
||||||
|
2012-04-25 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* config/rs6000/rs6000.c (START_USE, END_USE, NOT_INUSE): Define.
|
||||||
|
(rs6000_emit_prologue): Use the above to catch register overlap.
|
||||||
|
|
||||||
2012-04-25 Alan Modra <amodra@gmail.com>
|
2012-04-25 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* config/rs6000/rs6000.c (rs6000_emit_stack_reset): Delete forward
|
* config/rs6000/rs6000.c (rs6000_emit_stack_reset): Delete forward
|
||||||
|
|
|
@ -19302,6 +19302,29 @@ rs6000_emit_prologue (void)
|
||||||
HOST_WIDE_INT frame_off = 0;
|
HOST_WIDE_INT frame_off = 0;
|
||||||
HOST_WIDE_INT sp_off = 0;
|
HOST_WIDE_INT sp_off = 0;
|
||||||
|
|
||||||
|
#ifdef ENABLE_CHECKING
|
||||||
|
/* Track and check usage of r0, r11, r12. */
|
||||||
|
int reg_inuse = using_static_chain_p ? 1 << 11 : 0;
|
||||||
|
#define START_USE(R) do \
|
||||||
|
{ \
|
||||||
|
gcc_assert ((reg_inuse & (1 << (R))) == 0); \
|
||||||
|
reg_inuse |= 1 << (R); \
|
||||||
|
} while (0)
|
||||||
|
#define END_USE(R) do \
|
||||||
|
{ \
|
||||||
|
gcc_assert ((reg_inuse & (1 << (R))) != 0); \
|
||||||
|
reg_inuse &= ~(1 << (R)); \
|
||||||
|
} while (0)
|
||||||
|
#define NOT_INUSE(R) do \
|
||||||
|
{ \
|
||||||
|
gcc_assert ((reg_inuse & (1 << (R))) == 0); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define START_USE(R) do {} while (0)
|
||||||
|
#define END_USE(R) do {} while (0)
|
||||||
|
#define NOT_INUSE(R) do {} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
if (flag_stack_usage_info)
|
if (flag_stack_usage_info)
|
||||||
current_function_static_stack_size = info->total_size;
|
current_function_static_stack_size = info->total_size;
|
||||||
|
|
||||||
|
@ -19466,6 +19489,7 @@ rs6000_emit_prologue (void)
|
||||||
if (need_r11)
|
if (need_r11)
|
||||||
{
|
{
|
||||||
ptr_reg = gen_rtx_REG (Pmode, 11);
|
ptr_reg = gen_rtx_REG (Pmode, 11);
|
||||||
|
START_USE (11);
|
||||||
}
|
}
|
||||||
else if (info->total_size < 32767)
|
else if (info->total_size < 32767)
|
||||||
frame_off = info->total_size;
|
frame_off = info->total_size;
|
||||||
|
@ -19478,6 +19502,7 @@ rs6000_emit_prologue (void)
|
||||||
|| crtl->calls_eh_return)
|
|| crtl->calls_eh_return)
|
||||||
{
|
{
|
||||||
ptr_reg = gen_rtx_REG (Pmode, 12);
|
ptr_reg = gen_rtx_REG (Pmode, 12);
|
||||||
|
START_USE (12);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -19500,7 +19525,6 @@ rs6000_emit_prologue (void)
|
||||||
}
|
}
|
||||||
rs6000_emit_allocate_stack (info->total_size, ptr_reg, -frame_off);
|
rs6000_emit_allocate_stack (info->total_size, ptr_reg, -frame_off);
|
||||||
sp_off = info->total_size;
|
sp_off = info->total_size;
|
||||||
sp_off = info->total_size;
|
|
||||||
if (frame_reg_rtx != sp_reg_rtx)
|
if (frame_reg_rtx != sp_reg_rtx)
|
||||||
rs6000_emit_stack_tie (frame_reg_rtx, false);
|
rs6000_emit_stack_tie (frame_reg_rtx, false);
|
||||||
}
|
}
|
||||||
|
@ -19511,6 +19535,7 @@ rs6000_emit_prologue (void)
|
||||||
rtx addr, reg, mem;
|
rtx addr, reg, mem;
|
||||||
|
|
||||||
reg = gen_rtx_REG (Pmode, 0);
|
reg = gen_rtx_REG (Pmode, 0);
|
||||||
|
START_USE (0);
|
||||||
insn = emit_move_insn (reg, gen_rtx_REG (Pmode, LR_REGNO));
|
insn = emit_move_insn (reg, gen_rtx_REG (Pmode, LR_REGNO));
|
||||||
RTX_FRAME_RELATED_P (insn) = 1;
|
RTX_FRAME_RELATED_P (insn) = 1;
|
||||||
|
|
||||||
|
@ -19526,6 +19551,7 @@ rs6000_emit_prologue (void)
|
||||||
insn = emit_move_insn (mem, reg);
|
insn = emit_move_insn (mem, reg);
|
||||||
rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
|
rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
|
||||||
NULL_RTX, NULL_RTX);
|
NULL_RTX, NULL_RTX);
|
||||||
|
END_USE (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19538,6 +19564,7 @@ rs6000_emit_prologue (void)
|
||||||
rtx set;
|
rtx set;
|
||||||
|
|
||||||
cr_save_rtx = gen_rtx_REG (SImode, cr_save_regno);
|
cr_save_rtx = gen_rtx_REG (SImode, cr_save_regno);
|
||||||
|
START_USE (cr_save_regno);
|
||||||
insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
|
insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
|
||||||
RTX_FRAME_RELATED_P (insn) = 1;
|
RTX_FRAME_RELATED_P (insn) = 1;
|
||||||
/* Now, there's no way that dwarf2out_frame_debug_expr is going
|
/* Now, there's no way that dwarf2out_frame_debug_expr is going
|
||||||
|
@ -19581,6 +19608,8 @@ rs6000_emit_prologue (void)
|
||||||
/*savep=*/true, /*gpr=*/false, lr);
|
/*savep=*/true, /*gpr=*/false, lr);
|
||||||
rs6000_frame_related (insn, frame_reg_rtx, sp_off,
|
rs6000_frame_related (insn, frame_reg_rtx, sp_off,
|
||||||
NULL_RTX, NULL_RTX);
|
NULL_RTX, NULL_RTX);
|
||||||
|
if (lr)
|
||||||
|
END_USE (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save GPRs. This is done as a PARALLEL if we are using
|
/* Save GPRs. This is done as a PARALLEL if we are using
|
||||||
|
@ -19625,10 +19654,15 @@ rs6000_emit_prologue (void)
|
||||||
if (using_static_chain_p)
|
if (using_static_chain_p)
|
||||||
{
|
{
|
||||||
rtx r0 = gen_rtx_REG (Pmode, 0);
|
rtx r0 = gen_rtx_REG (Pmode, 0);
|
||||||
|
|
||||||
|
START_USE (0);
|
||||||
gcc_assert (info->first_gp_reg_save > 11);
|
gcc_assert (info->first_gp_reg_save > 11);
|
||||||
|
|
||||||
emit_move_insn (r0, spe_save_area_ptr);
|
emit_move_insn (r0, spe_save_area_ptr);
|
||||||
}
|
}
|
||||||
|
else if (REGNO (frame_reg_rtx) != 11)
|
||||||
|
START_USE (11);
|
||||||
|
|
||||||
emit_insn (gen_addsi3 (spe_save_area_ptr,
|
emit_insn (gen_addsi3 (spe_save_area_ptr,
|
||||||
frame_reg_rtx, GEN_INT (offset)));
|
frame_reg_rtx, GEN_INT (offset)));
|
||||||
if (!using_static_chain_p && REGNO (frame_reg_rtx) == 11)
|
if (!using_static_chain_p && REGNO (frame_reg_rtx) == 11)
|
||||||
|
@ -19659,8 +19693,16 @@ rs6000_emit_prologue (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move the static chain pointer back. */
|
/* Move the static chain pointer back. */
|
||||||
if (using_static_chain_p && !spe_regs_addressable)
|
if (!spe_regs_addressable)
|
||||||
emit_move_insn (spe_save_area_ptr, gen_rtx_REG (Pmode, 0));
|
{
|
||||||
|
if (using_static_chain_p)
|
||||||
|
{
|
||||||
|
emit_move_insn (spe_save_area_ptr, gen_rtx_REG (Pmode, 0));
|
||||||
|
END_USE (0);
|
||||||
|
}
|
||||||
|
else if (REGNO (frame_reg_rtx) != 11)
|
||||||
|
END_USE (11);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
|
else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
|
||||||
{
|
{
|
||||||
|
@ -19681,10 +19723,13 @@ rs6000_emit_prologue (void)
|
||||||
|
|
||||||
if (ptr_set_up)
|
if (ptr_set_up)
|
||||||
frame_off = -end_save;
|
frame_off = -end_save;
|
||||||
|
else
|
||||||
|
NOT_INUSE (ptr_regno);
|
||||||
emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
|
emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
|
||||||
}
|
}
|
||||||
else if (!ptr_set_up)
|
else if (!ptr_set_up)
|
||||||
{
|
{
|
||||||
|
NOT_INUSE (ptr_regno);
|
||||||
emit_move_insn (ptr_reg, frame_reg_rtx);
|
emit_move_insn (ptr_reg, frame_reg_rtx);
|
||||||
}
|
}
|
||||||
ptr_off = -end_save;
|
ptr_off = -end_save;
|
||||||
|
@ -19695,6 +19740,8 @@ rs6000_emit_prologue (void)
|
||||||
/*savep=*/true, /*gpr=*/true, lr);
|
/*savep=*/true, /*gpr=*/true, lr);
|
||||||
rs6000_frame_related (insn, ptr_reg, sp_off - ptr_off,
|
rs6000_frame_related (insn, ptr_reg, sp_off - ptr_off,
|
||||||
NULL_RTX, NULL_RTX);
|
NULL_RTX, NULL_RTX);
|
||||||
|
if (lr)
|
||||||
|
END_USE (0);
|
||||||
}
|
}
|
||||||
else if (!WORLD_SAVE_P (info) && using_store_multiple)
|
else if (!WORLD_SAVE_P (info) && using_store_multiple)
|
||||||
{
|
{
|
||||||
|
@ -19753,12 +19800,15 @@ rs6000_emit_prologue (void)
|
||||||
rtx save_insn, join_insn, note;
|
rtx save_insn, join_insn, note;
|
||||||
long toc_restore_insn;
|
long toc_restore_insn;
|
||||||
|
|
||||||
gcc_assert (REGNO (frame_reg_rtx) != 11);
|
|
||||||
tmp_reg = gen_rtx_REG (Pmode, 11);
|
tmp_reg = gen_rtx_REG (Pmode, 11);
|
||||||
tmp_reg_si = gen_rtx_REG (SImode, 11);
|
tmp_reg_si = gen_rtx_REG (SImode, 11);
|
||||||
if (using_static_chain_p)
|
if (using_static_chain_p)
|
||||||
emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
|
{
|
||||||
gcc_assert (saving_GPRs_inline && saving_FPRs_inline);
|
START_USE (0);
|
||||||
|
emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
START_USE (11);
|
||||||
emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
|
emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
|
||||||
/* Peek at instruction to which this function returns. If it's
|
/* Peek at instruction to which this function returns. If it's
|
||||||
restoring r2, then we know we've already saved r2. We can't
|
restoring r2, then we know we've already saved r2. We can't
|
||||||
|
@ -19811,7 +19861,12 @@ rs6000_emit_prologue (void)
|
||||||
RTX_FRAME_RELATED_P (join_insn) = 1;
|
RTX_FRAME_RELATED_P (join_insn) = 1;
|
||||||
|
|
||||||
if (using_static_chain_p)
|
if (using_static_chain_p)
|
||||||
emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
|
{
|
||||||
|
emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
|
||||||
|
END_USE (0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
END_USE (11);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save CR if we use any that must be preserved. */
|
/* Save CR if we use any that must be preserved. */
|
||||||
|
@ -19828,6 +19883,7 @@ rs6000_emit_prologue (void)
|
||||||
{
|
{
|
||||||
rtx set;
|
rtx set;
|
||||||
|
|
||||||
|
START_USE (0);
|
||||||
cr_save_rtx = gen_rtx_REG (SImode, 0);
|
cr_save_rtx = gen_rtx_REG (SImode, 0);
|
||||||
insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
|
insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
|
||||||
RTX_FRAME_RELATED_P (insn) = 1;
|
RTX_FRAME_RELATED_P (insn) = 1;
|
||||||
|
@ -19835,6 +19891,7 @@ rs6000_emit_prologue (void)
|
||||||
add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
|
add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
|
||||||
}
|
}
|
||||||
insn = emit_move_insn (mem, cr_save_rtx);
|
insn = emit_move_insn (mem, cr_save_rtx);
|
||||||
|
END_USE (REGNO (cr_save_rtx));
|
||||||
|
|
||||||
rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
|
rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
|
||||||
NULL_RTX, NULL_RTX);
|
NULL_RTX, NULL_RTX);
|
||||||
|
@ -19856,6 +19913,7 @@ rs6000_emit_prologue (void)
|
||||||
&& (info->vrsave_save_offset
|
&& (info->vrsave_save_offset
|
||||||
+ info->total_size - frame_off) > 32767))
|
+ info->total_size - frame_off) > 32767))
|
||||||
{
|
{
|
||||||
|
START_USE (12);
|
||||||
ptr_reg = gen_rtx_REG (Pmode, 12);
|
ptr_reg = gen_rtx_REG (Pmode, 12);
|
||||||
frame_reg_rtx = ptr_reg;
|
frame_reg_rtx = ptr_reg;
|
||||||
frame_off = -(info->altivec_save_offset + info->altivec_size);
|
frame_off = -(info->altivec_save_offset + info->altivec_size);
|
||||||
|
@ -19864,7 +19922,6 @@ rs6000_emit_prologue (void)
|
||||||
frame_off = info->total_size;
|
frame_off = info->total_size;
|
||||||
rs6000_emit_allocate_stack (info->total_size, ptr_reg, -frame_off);
|
rs6000_emit_allocate_stack (info->total_size, ptr_reg, -frame_off);
|
||||||
sp_off = info->total_size;
|
sp_off = info->total_size;
|
||||||
sp_off = info->total_size;
|
|
||||||
if (frame_reg_rtx != sp_reg_rtx)
|
if (frame_reg_rtx != sp_reg_rtx)
|
||||||
rs6000_emit_stack_tie (frame_reg_rtx, false);
|
rs6000_emit_stack_tie (frame_reg_rtx, false);
|
||||||
}
|
}
|
||||||
|
@ -19896,6 +19953,7 @@ rs6000_emit_prologue (void)
|
||||||
|
|
||||||
savereg = gen_rtx_REG (V4SImode, i);
|
savereg = gen_rtx_REG (V4SImode, i);
|
||||||
|
|
||||||
|
NOT_INUSE (0);
|
||||||
areg = gen_rtx_REG (Pmode, 0);
|
areg = gen_rtx_REG (Pmode, 0);
|
||||||
emit_move_insn (areg, GEN_INT (offset));
|
emit_move_insn (areg, GEN_INT (offset));
|
||||||
|
|
||||||
|
@ -19928,6 +19986,7 @@ rs6000_emit_prologue (void)
|
||||||
/* Get VRSAVE onto a GPR. Note that ABI_V4 might be using r12
|
/* Get VRSAVE onto a GPR. Note that ABI_V4 might be using r12
|
||||||
as frame_reg_rtx and r11 as the static chain pointer for
|
as frame_reg_rtx and r11 as the static chain pointer for
|
||||||
nested functions. */
|
nested functions. */
|
||||||
|
NOT_INUSE (0);
|
||||||
reg = gen_rtx_REG (SImode, 0);
|
reg = gen_rtx_REG (SImode, 0);
|
||||||
vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
|
vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
|
||||||
if (TARGET_MACHO)
|
if (TARGET_MACHO)
|
||||||
|
|
Loading…
Reference in New Issue