mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-19 21:31:42 +08:00
recog.c (insn_invalid_p): Add IN_GROUP parameter and use validate_change to add clobbers if...
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. From-SVN: r186748
This commit is contained in:
parent
d9030ea42a
commit
57ac4c3401
@ -1,3 +1,14 @@
|
||||
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
|
||||
|
@ -4413,7 +4413,7 @@ s390_expand_addcc (enum rtx_code cmp_code, rtx cmp_op0, rtx cmp_op1,
|
||||
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. */
|
||||
@ -4485,7 +4485,7 @@ s390_expand_addcc (enum rtx_code cmp_code, rtx cmp_op0, rtx cmp_op1,
|
||||
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. */
|
||||
|
@ -2087,7 +2087,7 @@ process_insert_insn (struct expr *expr)
|
||||
{
|
||||
rtx insn = emit_insn (gen_rtx_SET (VOIDmode, reg, exp));
|
||||
|
||||
if (insn_invalid_p (insn))
|
||||
if (insn_invalid_p (insn, false))
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
|
15
gcc/recog.c
15
gcc/recog.c
@ -309,10 +309,14 @@ canonicalize_change_group (rtx insn, rtx x)
|
||||
|
||||
|
||||
/* 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;
|
||||
@ -344,7 +348,10 @@ insn_invalid_p (rtx insn)
|
||||
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. */
|
||||
@ -413,7 +420,7 @@ verify_changes (int num)
|
||||
}
|
||||
else if (DEBUG_INSN_P (object))
|
||||
continue;
|
||||
else if (insn_invalid_p (object))
|
||||
else if (insn_invalid_p (object, true))
|
||||
{
|
||||
rtx pat = PATTERN (object);
|
||||
|
||||
|
@ -79,7 +79,7 @@ extern int asm_operand_ok (rtx, const char *, const char **);
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user