+2012-04-24 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
+ * recog.c (insn_invalid_p): Add IN_GROUP parameter and use
+ validate_change to add clobbers if IN_GROUP is nonzero.
+ (verify_changes): Call insn_invalid_p with IN_GROUP set to true.
+ * recog.h (insn_invalid_p): Add IN_GROUP parameter to function
+ prototype.
+ * gcse.c (process_insert_insn): Call insn_invalid_p with IN_GROUP
+ set to false.
+ * config/s390/s390.c (insn_invalid_p): Likewise.
+
2012-04-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/53084
insn = gen_rtx_SET (VOIDmode, gen_rtx_REG (cc_mode, CC_REGNUM),
gen_rtx_COMPARE (cc_mode, cmp_op0, cmp_op1));
/* We use insn_invalid_p here to add clobbers if required. */
- ret = insn_invalid_p (emit_insn (insn));
+ ret = insn_invalid_p (emit_insn (insn), false);
gcc_assert (!ret);
/* Emit ALC instruction pattern. */
insn = gen_rtx_SET (VOIDmode, gen_rtx_REG (cc_mode, CC_REGNUM),
gen_rtx_COMPARE (cc_mode, cmp_op0, cmp_op1));
/* We use insn_invalid_p here to add clobbers if required. */
- ret = insn_invalid_p (emit_insn (insn));
+ ret = insn_invalid_p (emit_insn (insn), false);
gcc_assert (!ret);
/* Emit SLB instruction pattern. */
{
rtx insn = emit_insn (gen_rtx_SET (VOIDmode, reg, exp));
- if (insn_invalid_p (insn))
+ if (insn_invalid_p (insn, false))
gcc_unreachable ();
}
/* This subroutine of apply_change_group verifies whether the changes to INSN
- were valid; i.e. whether INSN can still be recognized. */
+ were valid; i.e. whether INSN can still be recognized.
+
+ If IN_GROUP is true clobbers which have to be added in order to
+ match the instructions will be added to the current change group.
+ Otherwise the changes will take effect immediately. */
int
-insn_invalid_p (rtx insn)
+insn_invalid_p (rtx insn, bool in_group)
{
rtx pat = PATTERN (insn);
int num_clobbers = 0;
newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num_clobbers + 1));
XVECEXP (newpat, 0, 0) = pat;
add_clobbers (newpat, icode);
- PATTERN (insn) = pat = newpat;
+ if (in_group)
+ validate_change (insn, &PATTERN (insn), newpat, 1);
+ else
+ PATTERN (insn) = pat = newpat;
}
/* After reload, verify that all constraints are satisfied. */
}
else if (DEBUG_INSN_P (object))
continue;
- else if (insn_invalid_p (object))
+ else if (insn_invalid_p (object, true))
{
rtx pat = PATTERN (object);
extern bool validate_change (rtx, rtx *, rtx, bool);
extern bool validate_unshare_change (rtx, rtx *, rtx, bool);
extern bool canonicalize_change_group (rtx insn, rtx x);
-extern int insn_invalid_p (rtx);
+extern int insn_invalid_p (rtx, bool);
extern int verify_changes (int);
extern void confirm_change_group (void);
extern int apply_change_group (void);