@@ -1057,6 +1057,32 @@ adjust_mem_stores (rtx loc, const_rtx expr, void *data)
}
}
+/* Given a regno from the RTL instruction stream, return the
+ actual register number that will be used by final and debug
+ info emission. */
+static unsigned int
+real_regno (unsigned int regno)
+{
+#ifdef LEAF_REG_REMAP
+ if (regno < FIRST_PSEUDO_REGISTER
+ && crtl->uses_only_leaf_regs)
+ {
+ int remapped = LEAF_REG_REMAP (regno);
+
+ if (remapped >= 0)
+ regno = (unsigned int) remapped;
+ }
+#endif
+
+ return regno;
+}
+
+static unsigned int
+real_regno_rtx (rtx reg)
+{
+ return real_regno (REGNO (reg));
+}
+
/* Simplify INSN. Remove all {PRE,POST}_{INC,DEC,MODIFY} rtxes,
replace them with their value in the insn and add the side-effects
as other sets to the insn. */
@@ -1804,12 +1830,12 @@ var_reg_decl_set (dataflow_set *set, rtx loc, enum var_init_status initialized,
if (decl_p)
dv = dv_from_decl (var_debug_decl (dv_as_decl (dv)));
- for (node = set->regs[REGNO (loc)]; node; node = node->next)
+ for (node = set->regs[real_regno_rtx (loc)]; node; node = node->next)
if (dv_as_opaque (node->dv) == dv_as_opaque (dv)
&& node->offset == offset)
break;
if (!node)
- attrs_list_insert (&set->regs[REGNO (loc)], dv, offset, loc);
+ attrs_list_insert (&set->regs[real_regno_rtx (loc)], dv, offset, loc);
set_variable_part (set, loc, dv, offset, initialized, set_src, iopt);
}
@@ -1875,7 +1901,7 @@ var_reg_delete_and_set (dataflow_set *set, rtx loc, bool modify,
if (initialized == VAR_INIT_STATUS_UNKNOWN)
initialized = get_init_value (set, loc, dv_from_decl (decl));
- nextp = &set->regs[REGNO (loc)];
+ nextp = &set->regs[real_regno_rtx (loc)];
for (node = *nextp; node; node = next)
{
next = node->next;
@@ -1904,7 +1930,7 @@ var_reg_delete_and_set (dataflow_set *set, rtx loc, bool modify,
static void
var_reg_delete (dataflow_set *set, rtx loc, bool clobber)
{
- attrs *nextp = &set->regs[REGNO (loc)];
+ attrs *nextp = &set->regs[real_regno_rtx (loc)];
attrs node, next;
if (clobber)
@@ -2386,7 +2412,7 @@ val_bind (dataflow_set *set, rtx val, rtx loc, bool modified)
if (REG_P (loc))
{
if (modified)
- var_regno_delete (set, REGNO (loc));
+ var_regno_delete (set, real_regno_rtx (loc));
var_reg_decl_set (set, loc, VAR_INIT_STATUS_INITIALIZED,
dv_from_value (val), 0, NULL_RTX, INSERT);
}
@@ -2584,7 +2610,7 @@ val_resolve (dataflow_set *set, rtx val, rtx loc, rtx insn)
{
attrs node, found = NULL;
- for (node = set->regs[REGNO (loc)]; node; node = node->next)
+ for (node = set->regs[real_regno_rtx (loc)]; node; node = node->next)
if (dv_is_value_p (node->dv)
&& GET_MODE (dv_as_value (node->dv)) == GET_MODE (loc))
{
@@ -2838,7 +2864,8 @@ variable_union (variable src, dataflow_set *set)
{
if (!((REG_P (node2->loc)
&& REG_P (node->loc)
- && REGNO (node2->loc) == REGNO (node->loc))
+ && (real_regno_rtx (node2->loc)
+ == real_regno_rtx (node->loc)))
|| rtx_equal_p (node2->loc, node->loc)))
{
if (node2->init < node->init)
@@ -2871,7 +2898,8 @@ variable_union (variable src, dataflow_set *set)
for (node = src->var_part[i].loc_chain; node; node = node->next)
if (!((REG_P (dstnode->loc)
&& REG_P (node->loc)
- && REGNO (dstnode->loc) == REGNO (node->loc))
+ && (real_regno_rtx (dstnode->loc)
+ == real_regno_rtx (node->loc)))
|| rtx_equal_p (dstnode->loc, node->loc)))
{
location_chain new_node;
@@ -2920,7 +2948,8 @@ variable_union (variable src, dataflow_set *set)
{
if ((REG_P (vui[jj].lc->loc)
&& REG_P (node->loc)
- && REGNO (vui[jj].lc->loc) == REGNO (node->loc))
+ && (real_regno_rtx (vui[jj].lc->loc)
+ == real_regno_rtx (node->loc)))
|| rtx_equal_p (vui[jj].lc->loc, node->loc))
{
vui[jj].pos = jj + ii;
@@ -3372,9 +3401,9 @@ loc_cmp (rtx x, rtx y)
if (!REG_P (y))
return -1;
gcc_assert (GET_MODE (x) == GET_MODE (y));
- if (REGNO (x) == REGNO (y))
+ if (real_regno_rtx (x) == real_regno_rtx (y))
return 0;
- else if (REGNO (x) < REGNO (y))
+ else if (real_regno_rtx (x) < real_regno_rtx (y))
return -1;
else
return 1;
@@ -3720,7 +3749,7 @@ canonicalize_values_star (void **slot, void *data)
}
else if (GET_CODE (node->loc) == REG)
{
- attrs list = set->regs[REGNO (node->loc)], *listp;
+ attrs list = set->regs[real_regno_rtx (node->loc)], *listp;
/* Change an existing attribute referring to dv so that it
refers to cdv, removing any duplicate this might
@@ -3982,13 +4011,14 @@ variable_merge_over_cur (variable s1var, struct dfset_merge *dsm)
{
attrs list;
- for (list = dst->regs[REGNO (node->loc)]; list; list = list->next)
+ for (list = dst->regs[real_regno_rtx (node->loc)]; list;
+ list = list->next)
if (GET_MODE (node->loc) == GET_MODE (list->loc)
&& dv_is_value_p (list->dv))
break;
if (!list)
- attrs_list_insert (&dst->regs[REGNO (node->loc)],
+ attrs_list_insert (&dst->regs[real_regno_rtx (node->loc)],
dv, 0, node->loc);
/* If this value became canonical for another value that had
this register, we want to leave it alone. */
@@ -4364,7 +4394,7 @@ variable_post_merge_new_vals (void **slot, void *info)
goto restart;
}
- for (attp = &set->regs[REGNO (node->loc)]; (att = *attp);
+ for (attp = &set->regs[real_regno_rtx (node->loc)]; (att = *attp);
attp = &att->next)
if (att->offset == 0
&& GET_MODE (att->loc) == GET_MODE (node->loc))
@@ -4404,7 +4434,7 @@ variable_post_merge_new_vals (void **slot, void *info)
dataflow_set_init (*dfpm->permp);
}
- for (att = (*dfpm->permp)->regs[REGNO (node->loc)];
+ for (att = (*dfpm->permp)->regs[real_regno_rtx (node->loc)];
att; att = att->next)
if (GET_MODE (att->loc) == GET_MODE (node->loc))
{
@@ -4437,7 +4467,7 @@ variable_post_merge_new_vals (void **slot, void *info)
if (dump_file)
fprintf (dump_file,
"Created new value %u:%u for reg %i\n",
- v->uid, v->hash, REGNO (node->loc));
+ v->uid, v->hash, real_regno_rtx (node->loc));
}
var_reg_decl_set (*dfpm->permp, node->loc,
@@ -4500,7 +4530,7 @@ variable_post_merge_perm_vals (void **pslot, void *info)
val_reset (set, dv);
}
- for (att = set->regs[REGNO (pnode->loc)]; att; att = att->next)
+ for (att = set->regs[real_regno_rtx (pnode->loc)]; att; att = att->next)
if (att->offset == 0
&& GET_MODE (att->loc) == GET_MODE (pnode->loc)
&& dv_is_value_p (att->dv))
@@ -4517,7 +4547,7 @@ variable_post_merge_perm_vals (void **pslot, void *info)
}
else if (!att)
{
- attrs_list_insert (&set->regs[REGNO (pnode->loc)],
+ attrs_list_insert (&set->regs[real_regno_rtx (pnode->loc)],
dv, 0, pnode->loc);
variable_union (pvar, set);
}
@@ -4836,7 +4866,7 @@ variable_part_different_p (variable_part *vp1, variable_part *vp2)
{
if (REG_P (lc1->loc) && REG_P (lc2->loc))
{
- if (REGNO (lc1->loc) == REGNO (lc2->loc))
+ if (real_regno_rtx (lc1->loc) == real_regno_rtx (lc2->loc))
break;
}
if (rtx_equal_p (lc1->loc, lc2->loc))
@@ -5189,7 +5219,7 @@ track_loc_p (rtx loc, tree expr, HOST_WIDE_INT offset, bool store_reg_p,
if ((GET_MODE_SIZE (mode) > GET_MODE_SIZE (DECL_MODE (expr))
|| (store_reg_p
&& !COMPLEX_MODE_P (DECL_MODE (expr))
- && hard_regno_nregs[REGNO (loc)][DECL_MODE (expr)] == 1))
+ && hard_regno_nregs[real_regno_rtx (loc)][DECL_MODE (expr)] == 1))
&& offset + byte_lowpart_offset (DECL_MODE (expr), mode) == 0)
{
mode = DECL_MODE (expr);
@@ -5227,8 +5257,9 @@ var_lowpart (enum machine_mode mode, rtx loc)
return adjust_address_nv (loc, mode, offset);
reg_offset = subreg_lowpart_offset (mode, GET_MODE (loc));
- regno = REGNO (loc) + subreg_regno_offset (REGNO (loc), GET_MODE (loc),
- reg_offset, mode);
+ regno = real_regno_rtx (loc) + subreg_regno_offset (real_regno_rtx (loc),
+ GET_MODE (loc),
+ reg_offset, mode);
return gen_rtx_REG_offset (loc, mode, regno, offset);
}
@@ -6231,7 +6262,7 @@ prepare_call_arguments (basic_block bb, rtx insn)
&& GET_MODE (reg) == mode
&& GET_MODE_CLASS (mode) == MODE_INT
&& REG_P (x)
- && REGNO (x) == REGNO (reg)
+ && real_regno_rtx (x) == real_regno_rtx (reg)
&& GET_MODE (x) == mode
&& item)
{
@@ -6747,7 +6778,7 @@ compute_bb_dataflow (basic_block bb)
}
}
else if (REG_P (uloc))
- var_regno_delete (out, REGNO (uloc));
+ var_regno_delete (out, real_regno_rtx (uloc));
else if (MEM_P (uloc))
{
gcc_checking_assert (GET_CODE (vloc) == MEM);
@@ -7504,11 +7535,11 @@ set_slot_part (dataflow_set *set, rtx loc, void **slot,
nextp = &node->next)
if (REG_P (node->loc))
{
- if (REGNO (node->loc) < REGNO (loc))
+ if (real_regno_rtx (node->loc) < real_regno_rtx (loc))
c++;
else
{
- if (REGNO (node->loc) == REGNO (loc))
+ if (real_regno_rtx (node->loc) == real_regno_rtx (loc))
r = 0;
else
r = 1;
@@ -7575,7 +7606,7 @@ set_slot_part (dataflow_set *set, rtx loc, void **slot,
if (node
&& ((REG_P (node->loc) && REG_P (loc)
- && REGNO (node->loc) == REGNO (loc))
+ && real_regno_rtx (node->loc) == real_regno_rtx (loc))
|| rtx_equal_p (node->loc, loc)))
{
/* LOC is in the beginning of the chain so we have nothing
@@ -7631,7 +7662,7 @@ set_slot_part (dataflow_set *set, rtx loc, void **slot,
{
next = node->next;
if ((REG_P (node->loc) && REG_P (loc)
- && REGNO (node->loc) == REGNO (loc))
+ && real_regno_rtx (node->loc) == real_regno_rtx (loc))
|| rtx_equal_p (node->loc, loc))
{
/* Save these values, to assign to the new node, before
@@ -7729,7 +7760,7 @@ clobber_slot_part (dataflow_set *set, rtx loc, void **slot,
list, but preserve any other variable parts
that might be regarded as live in that same
register. */
- anextp = &set->regs[REGNO (node->loc)];
+ anextp = &set->regs[real_regno_rtx (node->loc)];
for (anode = *anextp; anode; anode = anext)
{
anext = anode->next;
@@ -7800,7 +7831,7 @@ delete_slot_part (dataflow_set *set, rtx loc, void **slot,
node = node->next)
{
if ((REG_P (node->loc) && REG_P (loc)
- && REGNO (node->loc) == REGNO (loc))
+ && real_regno_rtx (node->loc) == real_regno_rtx (loc))
|| rtx_equal_p (node->loc, loc))
{
slot = unshare_variable (set, slot, var,
@@ -7823,7 +7854,7 @@ delete_slot_part (dataflow_set *set, rtx loc, void **slot,
{
next = node->next;
if ((REG_P (node->loc) && REG_P (loc)
- && REGNO (node->loc) == REGNO (loc))
+ && real_regno_rtx (node->loc) == real_regno_rtx (loc))
|| rtx_equal_p (node->loc, loc))
{
/* If we have deleted the location which was last emitted
@@ -8596,10 +8627,10 @@ emit_note_insn_var_location (void **varp, void *data)
rtx new_loc = NULL;
if (REG_P (loc[n_var_parts])
- && hard_regno_nregs[REGNO (loc[n_var_parts])][mode] * 2
- == hard_regno_nregs[REGNO (loc[n_var_parts])][wider_mode]
- && end_hard_regno (mode, REGNO (loc[n_var_parts]))
- == REGNO (loc2))
+ && hard_regno_nregs[real_regno_rtx (loc[n_var_parts])][mode] * 2
+ == hard_regno_nregs[real_regno_rtx (loc[n_var_parts])][wider_mode]
+ && end_hard_regno (mode, real_regno_rtx (loc[n_var_parts]))
+ == real_regno_rtx (loc2))
{
if (! WORDS_BIG_ENDIAN && ! BYTES_BIG_ENDIAN)
new_loc = simplify_subreg (wider_mode, loc[n_var_parts],
@@ -8609,7 +8640,7 @@ emit_note_insn_var_location (void **varp, void *data)
if (new_loc)
{
if (!REG_P (new_loc)
- || REGNO (new_loc) != REGNO (loc[n_var_parts]))
+ || real_regno_rtx (new_loc) != real_regno_rtx (loc[n_var_parts]))
new_loc = NULL;
else
REG_ATTRS (new_loc) = REG_ATTRS (loc[n_var_parts]);
@@ -9065,8 +9096,8 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
&& MEM_P (XEXP (XEXP (XEXP (*p, 1), 0), 0))
&& REG_P (XEXP (XEXP (XEXP (XEXP (*p, 1), 0), 0),
0))
- && REGNO (XEXP (XEXP (*p, 0), 0))
- == REGNO (XEXP (XEXP (XEXP (XEXP (*p, 1), 0),
+ && real_regno_rtx (XEXP (XEXP (*p, 0), 0))
+ == real_regno_rtx (XEXP (XEXP (XEXP (XEXP (*p, 1), 0),
0), 0)))
*p = XEXP (XEXP (*p, 1), 1);
/* Just drop this item. */
@@ -9255,7 +9286,7 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
}
}
else if (REG_P (uloc))
- var_regno_delete (set, REGNO (uloc));
+ var_regno_delete (set, real_regno_rtx (uloc));
else if (MEM_P (uloc))
{
gcc_checking_assert (GET_CODE (vloc) == MEM);
@@ -9621,7 +9652,7 @@ vt_add_function_parameter (tree parm)
{
incoming = var_lowpart (mode, incoming);
gcc_assert (REGNO (incoming) < FIRST_PSEUDO_REGISTER);
- attrs_list_insert (&out->regs[REGNO (incoming)], dv, offset,
+ attrs_list_insert (&out->regs[real_regno_rtx (incoming)], dv, offset,
incoming);
set_variable_part (out, incoming, dv, offset,
VAR_INIT_STATUS_INITIALIZED, NULL, INSERT);
@@ -9795,7 +9826,7 @@ vt_initialize (void)
val = cselib_lookup_from_insn (reg, GET_MODE (reg), 1,
VOIDmode, get_insns ());
preserve_value (val);
- cselib_preserve_cfa_base_value (val, REGNO (reg));
+ cselib_preserve_cfa_base_value (val, real_regno_rtx (reg));
expr = plus_constant (GET_MODE (stack_pointer_rtx),
stack_pointer_rtx, -ofst);
cselib_add_permanent_equiv (val, expr, get_insns ());