This is the other case (apart from INSN_UID) in which the field being
moved is an "i".  I kept the gen_rtx_VAR_LOCATION interface the same
by writing it in C code.  As with INSN_UID, removing an "i" is safe
because genrecog and the equality routines don't care about VAR_LOCATIONs.
(Equality would only being meaningful if we also checked the decl in the
't' field.)

Tested on x86_64-linux-gnu.  OK to install?

Thanks,
Richard


gcc/
        * rtl.def (VAR_LOCATION): Remove "i" field.
        * rtl.h (rtx_def): Add u2.var_location_status.
        (PAT_VAR_LOCATION_STATUS): Use it.
        (gen_rtx_VAR_LOCATION): Declare.
        * gengenrtl.c (excluded_rtx): Add VAR_LOCATION.
        * emit-rtl.c (gen_rtx_VAR_LOCATION): New function.
        * var-tracking.c (emit_note_insn_var_location): Remove casts.

Index: gcc/rtl.def
===================================================================
--- gcc/rtl.def 2014-05-10 21:13:06.240993266 +0100
+++ gcc/rtl.def 2014-05-10 21:17:11.883121021 +0100
@@ -747,9 +747,7 @@ DEF_RTL_EXPR(US_TRUNCATE, "us_truncate",
 DEF_RTL_EXPR(FMA, "fma", "eee", RTX_TERNARY)
 
 /* Information about the variable and its location.  */
-/* Changed 'te' to 'tei'; the 'i' field is for recording
-   initialization status of variables.  */
-DEF_RTL_EXPR(VAR_LOCATION, "var_location", "tei", RTX_EXTRA)
+DEF_RTL_EXPR(VAR_LOCATION, "var_location", "te", RTX_EXTRA)
 
 /* Used in VAR_LOCATION for a pointer to a decl that is no longer
    addressable.  */
Index: gcc/rtl.h
===================================================================
--- gcc/rtl.h   2014-05-10 21:13:03.383968475 +0100
+++ gcc/rtl.h   2014-05-10 21:17:11.883121021 +0100
@@ -362,6 +362,9 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"
     /* The INSN_UID of an RTX_INSN-class code.  */
     int insn_uid;
 
+    /* The PAT_VAR_LOCATION_STATUS of a VAR_LOCATION.  */
+    enum var_init_status var_location_status;
+
     /* In a CONST_WIDE_INT (aka hwivec_def), this is the number of
        HOST_WIDE_INTs in the hwivec_def.  */
     unsigned num_elem;
@@ -1055,7 +1058,8 @@ #define PAT_VAR_LOCATION_LOC(PAT) (XCEXP
    can be unknown, uninitialized or initialized.  See enumeration
    type below.  */
 #define PAT_VAR_LOCATION_STATUS(PAT) \
-  ((enum var_init_status) (XCINT ((PAT), 2, VAR_LOCATION)))
+  (RTL_FLAG_CHECK1 ("PAT_VAR_LOCATION_STATUS", PAT, VAR_LOCATION) \
+   ->u2.var_location_status)
 
 /* Accessors for a NOTE_INSN_VAR_LOCATION.  */
 #define NOTE_VAR_LOCATION_DECL(NOTE) \
@@ -2561,6 +2565,8 @@ extern rtx gen_raw_REG (enum machine_mod
 extern rtx gen_rtx_REG (enum machine_mode, unsigned);
 extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
 extern rtx gen_rtx_MEM (enum machine_mode, rtx);
+extern rtx gen_rtx_VAR_LOCATION (enum machine_mode, tree, rtx,
+                                enum var_init_status);
 
 #define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (N))
 
Index: gcc/gengenrtl.c
===================================================================
--- gcc/gengenrtl.c     2014-05-10 21:05:11.696853423 +0100
+++ gcc/gengenrtl.c     2014-05-10 21:17:11.885121038 +0100
@@ -141,9 +141,10 @@ special_rtx (int idx)
 static int
 excluded_rtx (int idx)
 {
-  return ((strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0)
-         || (strcmp (defs[idx].enumname, "CONST_WIDE_INT") == 0)
-         || (strcmp (defs[idx].enumname, "CONST_FIXED") == 0));
+  return (strcmp (defs[idx].enumname, "VAR_LOCATION") == 0
+         || strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0
+         || strcmp (defs[idx].enumname, "CONST_WIDE_INT") == 0
+         || strcmp (defs[idx].enumname, "CONST_FIXED") == 0);
 }
 
 /* Place a list of all format specifiers we use into the array FORMAT.  */
Index: gcc/emit-rtl.c
===================================================================
--- gcc/emit-rtl.c      2014-05-10 21:13:03.380968449 +0100
+++ gcc/emit-rtl.c      2014-05-10 21:17:11.882121012 +0100
@@ -859,6 +859,15 @@ gen_lowpart_SUBREG (enum machine_mode mo
   return gen_rtx_SUBREG (mode, reg,
                         subreg_lowpart_offset (mode, inmode));
 }
+
+rtx
+gen_rtx_VAR_LOCATION (enum machine_mode mode, tree decl, rtx loc,
+                     enum var_init_status status)
+{
+  rtx x = gen_rtx_fmt_te (VAR_LOCATION, mode, decl, loc);
+  PAT_VAR_LOCATION_STATUS (x) = status;
+  return x;
+}
 
 
 /* Create an rtvec and stores within it the RTXen passed in the arguments.  */
Index: gcc/var-tracking.c
===================================================================
--- gcc/var-tracking.c  2014-05-10 21:05:11.696853423 +0100
+++ gcc/var-tracking.c  2014-05-10 21:17:11.885121038 +0100
@@ -8748,8 +8748,7 @@ emit_note_insn_var_location (variable_de
 
   note_vl = NULL_RTX;
   if (!complete)
-    note_vl = gen_rtx_VAR_LOCATION (VOIDmode, decl, NULL_RTX,
-                                   (int) initialized);
+    note_vl = gen_rtx_VAR_LOCATION (VOIDmode, decl, NULL_RTX, initialized);
   else if (n_var_parts == 1)
     {
       rtx expr_list;
@@ -8759,8 +8758,7 @@ emit_note_insn_var_location (variable_de
       else
        expr_list = loc[0];
 
-      note_vl = gen_rtx_VAR_LOCATION (VOIDmode, decl, expr_list,
-                                     (int) initialized);
+      note_vl = gen_rtx_VAR_LOCATION (VOIDmode, decl, expr_list, initialized);
     }
   else if (n_var_parts)
     {
@@ -8773,7 +8771,7 @@ emit_note_insn_var_location (variable_de
       parallel = gen_rtx_PARALLEL (VOIDmode,
                                   gen_rtvec_v (n_var_parts, loc));
       note_vl = gen_rtx_VAR_LOCATION (VOIDmode, decl,
-                                     parallel, (int) initialized);
+                                     parallel, initialized);
     }
 
   if (where != EMIT_NOTE_BEFORE_INSN)

Reply via email to