int count = 0;
rtx value = NULL_RTX;
+ /* Registers mentioned in the clobber list for an asm cannot be reused
+ within the body of the asm. Invalidate those registers now so that
+ we don't try to substitute values for them. */
+ if (asm_noperands (body) >= 0)
+ {
+ for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
+ {
+ rtx part = XVECEXP (body, 0, i);
+ if (GET_CODE (part) == CLOBBER && REG_P (XEXP (part, 0)))
+ cselib_invalidate_rtx (XEXP (part, 0));
+ }
+ }
+
/* If every action in a PARALLEL is a noop, we can delete
the entire PARALLEL. */
for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
if (this_val == trunc_int_for_mode (this_val, GET_MODE (src)))
break;
default:
- gcc_unreachable ();
+ abort ();
}
this_rtx = GEN_INT (this_val);
}
extension. Punt on this for now. */
if (! set)
continue;
- /* If the destination is a also MEM or a STRICT_LOW_PART, no
+ /* If the destination is also a MEM or a STRICT_LOW_PART, no
extension applies.
Also, if there is an explicit extension, we don't have to
worry about an implicit one. */
if (REG_P (SET_DEST (x)))
{
/* No spurious CLOBBERs of pseudo registers may remain. */
- gcc_assert (REGNO (SET_DEST (x)) < FIRST_PSEUDO_REGISTER);
+ if (REGNO (SET_DEST (x)) >= FIRST_PSEUDO_REGISTER)
+ abort ();
return;
}
break;
int nregs;
/* No spurious USEs of pseudo registers may remain. */
- gcc_assert (regno < FIRST_PSEUDO_REGISTER);
+ if (regno >= FIRST_PSEUDO_REGISTER)
+ abort ();
nregs = hard_regno_nregs[regno][GET_MODE (x)];