From 3e89ed8dd36d61b8ebb6dea3a21c55a56d1662ac Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 20 Jan 2004 23:16:59 +0100 Subject: [PATCH] emit-rtl.c (verify_rtx_sharing, [...]): Clobbers containing hard regs are shared. * 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. From-SVN: r76233 --- gcc/ChangeLog | 11 +++++++++++ gcc/emit-rtl.c | 25 ++++++++++++++++++++++++- gcc/genemit.c | 8 ++++++++ gcc/rtl.c | 4 ++++ gcc/rtl.h | 1 + 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc323843542e..31d731b36be0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-01-20 Jan Hubicka + + * 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 * varray.c: Include hashtab.h diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index a77b9d1e0e9d..cdb0c2a3c316 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2231,8 +2231,12 @@ verify_rtx_sharing (rtx orig, rtx insn) 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 @@ -2527,6 +2531,10 @@ repeat: 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 @@ -5020,6 +5028,10 @@ copy_insn_1 (rtx orig) 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++) @@ -5536,4 +5548,15 @@ emit_copy_of_insn_after (rtx insn, rtx after) 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" diff --git a/gcc/genemit.c b/gcc/genemit.c index 0e695d2729c3..0ab88b00dd40 100644 --- a/gcc/genemit.c +++ b/gcc/genemit.c @@ -217,6 +217,14 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used) 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"); diff --git a/gcc/rtl.c b/gcc/rtl.c index 313e2cb2b5c3..87ffcbbb3003 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -224,6 +224,10 @@ copy_rtx (rtx orig) /* 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 diff --git a/gcc/rtl.h b/gcc/rtl.h index fbd8eca337fd..c1949f18e126 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2308,6 +2308,7 @@ extern void end_alias_analysis (void); 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 { -- 2.43.5