re PR middle-end/30761 (Error: unsupported relocation against sfp)
PR middle-end/30761 * reload1.c (eliminate_regs_in_insn): In the single_set special case, attempt to re-recognize the insn before falling back to having reload fix it up. From-SVN: r122199
This commit is contained in:
parent
71d6fc6b0b
commit
551d69292f
|
@ -1,3 +1,10 @@
|
||||||
|
2007-02-21 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
|
PR middle-end/30761
|
||||||
|
* reload1.c (eliminate_regs_in_insn): In the single_set special
|
||||||
|
case, attempt to re-recognize the insn before falling back to
|
||||||
|
having reload fix it up.
|
||||||
|
|
||||||
2007-02-20 Eric Christopher <echristo@gmail.com>
|
2007-02-20 Eric Christopher <echristo@gmail.com>
|
||||||
|
|
||||||
* config/frv/frv.c (frv_read_argument): Take a tree and int argument.
|
* config/frv/frv.c (frv_read_argument): Take a tree and int argument.
|
||||||
|
|
|
@ -3105,35 +3105,15 @@ eliminate_regs_in_insn (rtx insn, int replace)
|
||||||
if (GET_CODE (XEXP (plus_cst_src, 0)) == SUBREG)
|
if (GET_CODE (XEXP (plus_cst_src, 0)) == SUBREG)
|
||||||
to_rtx = gen_lowpart (GET_MODE (XEXP (plus_cst_src, 0)),
|
to_rtx = gen_lowpart (GET_MODE (XEXP (plus_cst_src, 0)),
|
||||||
to_rtx);
|
to_rtx);
|
||||||
if (offset == 0)
|
|
||||||
{
|
|
||||||
int num_clobbers;
|
|
||||||
/* We assume here that if we need a PARALLEL with
|
|
||||||
CLOBBERs for this assignment, we can do with the
|
|
||||||
MATCH_SCRATCHes that add_clobbers allocates.
|
|
||||||
There's not much we can do if that doesn't work. */
|
|
||||||
PATTERN (insn) = gen_rtx_SET (VOIDmode,
|
|
||||||
SET_DEST (old_set),
|
|
||||||
to_rtx);
|
|
||||||
num_clobbers = 0;
|
|
||||||
INSN_CODE (insn) = recog (PATTERN (insn), insn, &num_clobbers);
|
|
||||||
if (num_clobbers)
|
|
||||||
{
|
|
||||||
rtvec vec = rtvec_alloc (num_clobbers + 1);
|
|
||||||
|
|
||||||
vec->elem[0] = PATTERN (insn);
|
|
||||||
PATTERN (insn) = gen_rtx_PARALLEL (VOIDmode, vec);
|
|
||||||
add_clobbers (PATTERN (insn), INSN_CODE (insn));
|
|
||||||
}
|
|
||||||
gcc_assert (INSN_CODE (insn) >= 0);
|
|
||||||
}
|
|
||||||
/* If we have a nonzero offset, and the source is already
|
/* If we have a nonzero offset, and the source is already
|
||||||
a simple REG, the following transformation would
|
a simple REG, the following transformation would
|
||||||
increase the cost of the insn by replacing a simple REG
|
increase the cost of the insn by replacing a simple REG
|
||||||
with (plus (reg sp) CST). So try only when we already
|
with (plus (reg sp) CST). So try only when we already
|
||||||
had a PLUS before. */
|
had a PLUS before. */
|
||||||
else if (plus_src)
|
if (offset == 0 || plus_src)
|
||||||
{
|
{
|
||||||
|
rtx new_src = plus_constant (to_rtx, offset);
|
||||||
|
|
||||||
new_body = old_body;
|
new_body = old_body;
|
||||||
if (! replace)
|
if (! replace)
|
||||||
{
|
{
|
||||||
|
@ -3144,8 +3124,20 @@ eliminate_regs_in_insn (rtx insn, int replace)
|
||||||
PATTERN (insn) = new_body;
|
PATTERN (insn) = new_body;
|
||||||
old_set = single_set (insn);
|
old_set = single_set (insn);
|
||||||
|
|
||||||
XEXP (SET_SRC (old_set), 0) = to_rtx;
|
/* First see if this insn remains valid when we make the
|
||||||
XEXP (SET_SRC (old_set), 1) = GEN_INT (offset);
|
change. If not, try to replace the whole pattern with
|
||||||
|
a simple set (this may help if the original insn was a
|
||||||
|
PARALLEL that was only recognized as single_set due to
|
||||||
|
REG_UNUSED notes). If this isn't valid either, keep
|
||||||
|
the INSN_CODE the same and let reload fix it up. */
|
||||||
|
if (!validate_change (insn, &SET_SRC (old_set), new_src, 0))
|
||||||
|
{
|
||||||
|
rtx new_pat = gen_rtx_SET (VOIDmode,
|
||||||
|
SET_DEST (old_set), new_src);
|
||||||
|
|
||||||
|
if (!validate_change (insn, &PATTERN (insn), new_pat, 0))
|
||||||
|
SET_SRC (old_set) = new_src;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue