OSDN Git Service

* emit-rtl.c (verify_rtx_sharing, copy_insn_1,
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Jan 2004 22:16:59 +0000 (22:16 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Jan 2004 22:16:59 +0000 (22:16 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@76233 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/emit-rtl.c
gcc/genemit.c
gcc/rtl.c
gcc/rtl.h

index dc32384..31d731b 100644 (file)
@@ -1,5 +1,16 @@
 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,
index a77b9d1..cdb0c2a 100644 (file)
@@ -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"
index 0e695d2..0ab88b0 100644 (file)
@@ -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");
index 313e2cb..87ffcbb 100644 (file)
--- 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
index fbd8eca..c1949f1 100644 (file)
--- 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 {