2004-01-20 Jan Hubicka <jh@suse.cz>
+ * emit-rtl.c (verify_rtx_sharing, copy_insn_1,
+ emit_copy_of_insn_after, emit_copy_of_insn_after): Clobbers
+ containing hard regs are shared.
+ (gen_hard_reg_clobber): New function.
+ (hard_reg_clobbers): New array.
+ * genemit.c (gen_exp): Use gen_hard_reg_clobber.
+ (copy_rtx): Do not copy clobbers containing hard regs.
+ * rtl.h (gen_hard_reg_clobber): Declare.
+
+2004-01-20 Jan Hubicka <jh@suse.cz>
+
* varray.c: Include hashtab.h
(varray_descriptor): New structure.
(hash_descriptor, eq_descriptor, varray_descriptor,
case PC:
case CC0:
case SCRATCH:
- /* SCRATCH must be shared because they represent distinct values. */
return;
+ /* SCRATCH must be shared because they represent distinct values. */
+ case CLOBBER:
+ if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
+ return;
+ break;
case CONST:
/* CONST can be shared if it contains a SYMBOL_REF. If it contains
case SCRATCH:
/* SCRATCH must be shared because they represent distinct values. */
return;
+ case CLOBBER:
+ if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
+ return;
+ break;
case CONST:
/* CONST can be shared if it contains a SYMBOL_REF. If it contains
case CC0:
case ADDRESSOF:
return orig;
+ case CLOBBER:
+ if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
+ return orig;
+ break;
case SCRATCH:
for (i = 0; i < copy_insn_n_scratches; i++)
return new;
}
+static GTY((deletable(""))) rtx hard_reg_clobbers [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
+rtx
+gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
+{
+ if (hard_reg_clobbers[mode][regno])
+ return hard_reg_clobbers[mode][regno];
+ else
+ return (hard_reg_clobbers[mode][regno] =
+ gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)));
+}
+
#include "gt-emit-rtl.h"
case PC:
printf ("pc_rtx");
return;
+ case CLOBBER:
+ if (REG_P (XEXP (x, 0)))
+ {
+ printf ("gen_hard_reg_clobber (%smode, %i)", GET_MODE_NAME (GET_MODE (XEXP (x, 0))),
+ REGNO (XEXP (x, 0)));
+ return;
+ }
+ break;
case CC0:
printf ("cc0_rtx");
/* SCRATCH must be shared because they represent distinct values. */
case ADDRESSOF:
return orig;
+ case CLOBBER:
+ if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
+ return orig;
+ break;
case CONST:
/* CONST can be shared if it contains a SYMBOL_REF. If it contains
extern rtx addr_side_effect_eval (rtx, int, int);
extern bool memory_modified_in_insn_p (rtx, rtx);
extern rtx find_base_term (rtx);
+extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
/* In sibcall.c */
typedef enum {