cse.c (struct change_cc_mode_args): New structure.
2004-11-16 Andreas Krebbel <krebbel1@de.ibm.com> * gcc/cse.c (struct change_cc_mode_args): New structure. (cse_change_cc_mode_insn): New function. (cse_change_cc_mode): Use validate_change to perfom changes. (cse_change_cc_mode_insns, cse_condition_code_reg): Call cse_change_cc_mode_insn. From-SVN: r90728
This commit is contained in:
parent
be06f47bc1
commit
fc188d37b3
|
@ -1,3 +1,11 @@
|
|||
2004-11-16 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* gcc/cse.c (struct change_cc_mode_args): New structure.
|
||||
(cse_change_cc_mode_insn): New function.
|
||||
(cse_change_cc_mode): Use validate_change to perfom changes.
|
||||
(cse_change_cc_mode_insns, cse_condition_code_reg):
|
||||
Call cse_change_cc_mode_insn.
|
||||
|
||||
2004-11-16 Steven Bosscher <stevenb@suse.de>
|
||||
|
||||
* stack.h: Remove.
|
||||
|
|
56
gcc/cse.c
56
gcc/cse.c
|
@ -263,6 +263,14 @@ struct qty_table_elem
|
|||
/* The table of all qtys, indexed by qty number. */
|
||||
static struct qty_table_elem *qty_table;
|
||||
|
||||
/* Structure used to pass arguments via for_each_rtx to function
|
||||
cse_change_cc_mode. */
|
||||
struct change_cc_mode_args
|
||||
{
|
||||
rtx insn;
|
||||
rtx newreg;
|
||||
};
|
||||
|
||||
#ifdef HAVE_cc0
|
||||
/* For machines that have a CC0, we do not record its value in the hash
|
||||
table since its use is guaranteed to be the insn immediately following
|
||||
|
@ -653,6 +661,7 @@ static bool insn_live_p (rtx, int *);
|
|||
static bool set_live_p (rtx, rtx, int *);
|
||||
static bool dead_libcall_p (rtx, int *);
|
||||
static int cse_change_cc_mode (rtx *, void *);
|
||||
static void cse_change_cc_mode_insn (rtx, rtx);
|
||||
static void cse_change_cc_mode_insns (rtx, rtx, rtx);
|
||||
static enum machine_mode cse_cc_succs (basic_block, rtx, rtx, bool);
|
||||
|
||||
|
@ -7303,19 +7312,46 @@ delete_trivially_dead_insns (rtx insns, int nreg)
|
|||
static int
|
||||
cse_change_cc_mode (rtx *loc, void *data)
|
||||
{
|
||||
rtx newreg = (rtx) data;
|
||||
struct change_cc_mode_args* args = (struct change_cc_mode_args*)data;
|
||||
|
||||
if (*loc
|
||||
&& REG_P (*loc)
|
||||
&& REGNO (*loc) == REGNO (newreg)
|
||||
&& GET_MODE (*loc) != GET_MODE (newreg))
|
||||
&& REGNO (*loc) == REGNO (args->newreg)
|
||||
&& GET_MODE (*loc) != GET_MODE (args->newreg))
|
||||
{
|
||||
*loc = newreg;
|
||||
validate_change (args->insn, loc, args->newreg, 1);
|
||||
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Change the mode of any reference to the register REGNO (NEWREG) to
|
||||
GET_MODE (NEWREG) in INSN. */
|
||||
|
||||
static void
|
||||
cse_change_cc_mode_insn (rtx insn, rtx newreg)
|
||||
{
|
||||
struct change_cc_mode_args args;
|
||||
int success;
|
||||
|
||||
if (!INSN_P (insn))
|
||||
return;
|
||||
|
||||
args.insn = insn;
|
||||
args.newreg = newreg;
|
||||
|
||||
for_each_rtx (&PATTERN (insn), cse_change_cc_mode, &args);
|
||||
for_each_rtx (®_NOTES (insn), cse_change_cc_mode, &args);
|
||||
|
||||
/* If the following assertion was triggered, there is most probably
|
||||
something wrong with the cc_modes_compatible back end function.
|
||||
CC modes only can be considered compatible if the insn - with the mode
|
||||
replaced by any of the compatible modes - can still be recognized. */
|
||||
success = apply_change_group ();
|
||||
gcc_assert (success);
|
||||
}
|
||||
|
||||
/* Change the mode of any reference to the register REGNO (NEWREG) to
|
||||
GET_MODE (NEWREG), starting at START. Stop before END. Stop at
|
||||
any instruction which modifies NEWREG. */
|
||||
|
@ -7333,8 +7369,7 @@ cse_change_cc_mode_insns (rtx start, rtx end, rtx newreg)
|
|||
if (reg_set_p (newreg, insn))
|
||||
return;
|
||||
|
||||
for_each_rtx (&PATTERN (insn), cse_change_cc_mode, newreg);
|
||||
for_each_rtx (®_NOTES (insn), cse_change_cc_mode, newreg);
|
||||
cse_change_cc_mode_insn (insn, newreg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7443,6 +7478,8 @@ cse_cc_succs (basic_block bb, rtx cc_reg, rtx cc_src, bool can_change_mode)
|
|||
{
|
||||
gcc_assert (can_change_mode);
|
||||
mode = comp_mode;
|
||||
|
||||
/* The modified insn will be re-recognized later. */
|
||||
PUT_MODE (cc_src, mode);
|
||||
}
|
||||
}
|
||||
|
@ -7622,12 +7659,7 @@ cse_condition_code_reg (void)
|
|||
{
|
||||
rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
|
||||
|
||||
/* Change the mode of CC_REG in CC_SRC_INSN to
|
||||
GET_MODE (NEWREG). */
|
||||
for_each_rtx (&PATTERN (cc_src_insn), cse_change_cc_mode,
|
||||
newreg);
|
||||
for_each_rtx (®_NOTES (cc_src_insn), cse_change_cc_mode,
|
||||
newreg);
|
||||
cse_change_cc_mode_insn (cc_src_insn, newreg);
|
||||
|
||||
/* Do the same in the following insns that use the
|
||||
current value of CC_REG within BB. */
|
||||
|
|
Loading…
Reference in New Issue