diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ecf8202b84e32ac5c7b4257ab0d97431ae546656..0069cd37e3425b397a466abfd0e8fe758e74da22 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2003-04-28  Zack Weinberg  <zack@codesourcery.com>
+
+	* tree.h (TREE_CST_RTL, CST_OR_CONSTRUCTOR_CHECK): Delete.
+	(struct tree_int_cst, struct tree_real_cst, struct tree_string,
+	struct tree_complex, struct tree_vector): Remove RTL field.
+	(CONSTRUCTOR_ELTS): Use elt 0.
+	* tree.def (CONSTRUCTOR): Delete first of its two operands.
+	* varasm.c (output_constant_def): Remove early exit if
+	TREE_CST_RTL is set.  Don't set TREE_CST_RTL.
+	(decode_addr_const): Don't mention TREE_CST_RTL in comment.
+	* target.h (select_section): Don't mention TREE_CST_RTL in comment.
+	* doc/tm.texi (encode_section_info): Don't talk about TREE_CST_RTL.
+
 2003-04-28  Jakub Jelinek  <jakub@redhat.com>
 
 	* c-decl.c (finish_decl): When prototype with asmspec is found
@@ -8,16 +21,16 @@
 
 2003-04-28  Richard Henderson  <rth@redhat.com>
 
-        * config/sparc/sparc.c (print_operand): Add 's' to sign-extend.
-        * config/sparc/sparc.md (const_mulsidi3_v8plus): Fix mode of
-        integral constant mult operand.
-        (const_mulsidi3_sp32, const_mulsidi3_sp64): Likewise.
-        (const_smulsi3_highpart_v8plus): Likewise.
-        (const_smulsi3_highpart): Likewise.
-        (const_umulsidi3_sp32): Likewise; sign-extend it in the output.
-        (const_umulsidi3_sp64, const_umulsidi3_v8plus): Likewise.
-        (const_umulsi3_highpart_v8plus): Likewise.
-        (const_umulsi3_highpart): Likewise.
+	* config/sparc/sparc.c (print_operand): Add 's' to sign-extend.
+	* config/sparc/sparc.md (const_mulsidi3_v8plus): Fix mode of
+	integral constant mult operand.
+	(const_mulsidi3_sp32, const_mulsidi3_sp64): Likewise.
+	(const_smulsi3_highpart_v8plus): Likewise.
+	(const_smulsi3_highpart): Likewise.
+	(const_umulsidi3_sp32): Likewise; sign-extend it in the output.
+	(const_umulsidi3_sp64, const_umulsidi3_v8plus): Likewise.
+	(const_umulsi3_highpart_v8plus): Likewise.
+	(const_umulsi3_highpart): Likewise.
 
 2003-04-28  David O'Brien  <obrien@FreeBSD.org>
 
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 0d720738ffed0358195757e67e8e9c810c776bad..e0b9aa28da123696a20f28dbda038b8555bc395a 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,7 @@
+2003-04-28  Zack Weinberg  <zack@codesourcery.com>
+
+	* utils.c (convert): No need to clear TREE_CST_RTL.
+
 2003-04-23   Geert Bosch <bosch@gnat.com>
 
 	* 1aexcept.adb, 1aexcept.ads, 1ic.ads, 1ssecsta.adb,
diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c
index fa58936a53eb79f169de976a6c88492f14e7c61d..d21a097cfdd02647110fe41a76e362d1cc261d3d 100644
--- a/gcc/ada/utils.c
+++ b/gcc/ada/utils.c
@@ -2877,18 +2877,13 @@ convert (type, expr)
     case CONSTRUCTOR:
       /* If we are converting a STRING_CST to another constrained array type,
 	 just make a new one in the proper type.  Likewise for a
-	 CONSTRUCTOR.  But if the mode of the type is different, we must
-	 ensure a new RTL is made for the constant.  */
+	 CONSTRUCTOR.  */
       if (code == ecode && AGGREGATE_TYPE_P (etype)
 	  && ! (TREE_CODE (TYPE_SIZE (etype)) == INTEGER_CST
 		&& TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
 	{
 	  expr = copy_node (expr);
 	  TREE_TYPE (expr) = type;
-
-	  if (TYPE_MODE (type) != TYPE_MODE (etype))
-	    TREE_CST_RTL (expr) = 0;
-
 	  return expr;
 	}
       break;
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 88ad237291a1ae5d73783c76f87cf4a16bd9dc17..c932422ce98467a81e8a8ea2c2fa348839b86b3b 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -6062,8 +6062,7 @@ The hook is executed immediately after rtl has been created for
 @var{decl}, which may be a variable or function declaration or
 an entry in the constant pool.  In either case, @var{rtl} is the
 rtl in question.  Do @emph{not} use @code{DECL_RTL (@var{decl})}
-or @code{TREE_CST_RTL (@var{decl})} in this hook; that field may
-not have been initialized yet.
+in this hook; that field may not have been initialized yet.
 
 In the case of a constant, it is safe to assume that the rtl is
 a @code{mem} whose address is a @code{symbol_ref}.  Most decls
diff --git a/gcc/target.h b/gcc/target.h
index 8207b3216efd67e34620f8609601744551547c65..12e95735c8bf5dbef607ccceed72bb032f5bfd81 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -102,10 +102,9 @@ struct gcc_target
     void (* eh_frame_section) PARAMS ((void));
 
     /* Select and switch to a section for EXP.  It may be a DECL or a
-       constant for which TREE_CST_RTL is valid.  RELOC is nonzero if
-       runtime relocations must be applied; bit 1 will be set if the
-       runtime relocations require non-local name resolution.  ALIGN is
-       the required alignment of the data.  */
+       constant.  RELOC is nonzero if runtime relocations must be applied;
+       bit 1 will be set if the runtime relocations require non-local
+       name resolution.  ALIGN is the required alignment of the data.  */
     void (* select_section) PARAMS ((tree, int, unsigned HOST_WIDE_INT));
 
     /* Select and switch to a section for X with MODE.  ALIGN is
diff --git a/gcc/tree.def b/gcc/tree.def
index a8f35ca9da95a264a161a2c832645bb489f28f55..378830c81bf15166e77034f43614d23594b624ab 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -387,10 +387,8 @@ DEFTREECODE (VTABLE_REF, "vtable_ref", 'r', 3)
 /* Constructor: return an aggregate value made from specified components.
    In C, this is used only for structure and array initializers.
    Also used for SET_TYPE in Chill (and potentially Pascal).
-   The first "operand" is really a pointer to the RTL,
-   for constant constructors only.
-   The second operand is a list of component values
-   made out of a chain of TREE_LIST nodes.
+   The operand is a list of component values made out of a chain of
+   TREE_LIST nodes.
 
    For ARRAY_TYPE:
    The TREE_PURPOSE of each node is the corresponding index.
@@ -406,7 +404,7 @@ DEFTREECODE (VTABLE_REF, "vtable_ref", 'r', 3)
    The TREE_VALUE specifies a value (index) in the set that is true.
    If TREE_PURPOSE is non-NULL, it specifies the lower limit of a
    range of true values.  Elements not listed are false (not in the set).  */
-DEFTREECODE (CONSTRUCTOR, "constructor", 'e', 2)
+DEFTREECODE (CONSTRUCTOR, "constructor", 'e', 1)
 
 /* The expression types are mostly straightforward, with the fourth argument
    of DEFTREECODE saying how many operands there are.
diff --git a/gcc/tree.h b/gcc/tree.h
index 44ccd45178458c039ed8915cb7f7f7d00b0ae9db..4b0b4a6eb7ddd07de9847318ad8ed93e8062f4f2 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -295,13 +295,6 @@ struct tree_common GTY(())
     __t; })
 
 /* These checks have to be special cased.  */
-#define CST_OR_CONSTRUCTOR_CHECK(t) __extension__			\
-({  const tree __t = (t);						\
-    enum tree_code const __c = TREE_CODE(__t);				\
-    if (__c != CONSTRUCTOR && TREE_CODE_CLASS(__c) != 'c')		\
-      tree_check_failed (__t, CONSTRUCTOR, __FILE__, __LINE__,		\
-			 __FUNCTION__);					\
-    __t; })
 #define EXPR_CHECK(t) __extension__					\
 ({  const tree __t = (t);						\
     char const __c = TREE_CODE_CLASS(TREE_CODE(__t));			\
@@ -748,8 +741,6 @@ extern void tree_operand_check_failed PARAMS ((int, enum tree_code,
 struct tree_int_cst GTY(())
 {
   struct tree_common common;
-  rtx rtl;	/* acts as link to register transfer language
-			   (rtl) info */
   /* A sub-struct is necessary here because the function `const_hash'
      wants to scan both words as a unit and taking the address of the
      sub-struct yields the properly inclusive bounded pointer.  */
@@ -759,12 +750,6 @@ struct tree_int_cst GTY(())
   } int_cst;
 };
 
-/* In REAL_CST, STRING_CST, COMPLEX_CST, VECTOR_CST nodes, and
-   CONSTRUCTOR nodes, and generally in all kinds of constants that
-   could be given labels (rather than being immediate).  */
-
-#define TREE_CST_RTL(NODE) (CST_OR_CONSTRUCTOR_CHECK (NODE)->real_cst.rtl)
-
 /* In a REAL_CST node.  struct real_value is an opaque entity, with
    manipulators defined in real.h.  We don't want tree.h depending on
    real.h and transitively on tm.h.  */
@@ -776,7 +761,6 @@ struct real_value;
 struct tree_real_cst GTY(())
 {
   struct tree_common common;
-  rtx rtl;	/* acts as link to register transfer language (rtl) info */
   struct real_value * real_cst_ptr;
 };
 
@@ -787,7 +771,6 @@ struct tree_real_cst GTY(())
 struct tree_string GTY(())
 {
   struct tree_common common;
-  rtx rtl;	/* acts as link to register transfer language (rtl) info */
   int length;
   const char *pointer;
 };
@@ -799,7 +782,6 @@ struct tree_string GTY(())
 struct tree_complex GTY(())
 {
   struct tree_common common;
-  rtx rtl;	/* acts as link to register transfer language (rtl) info */
   tree real;
   tree imag;
 };
@@ -810,7 +792,6 @@ struct tree_complex GTY(())
 struct tree_vector GTY(())
 {
   struct tree_common common;
-  rtx rtl;
   tree elements;
 };
 
@@ -883,7 +864,7 @@ struct tree_vec GTY(())
   TREE_RTL_OPERAND_CHECK (NODE, WITH_CLEANUP_EXPR, 2)
 
 /* In a CONSTRUCTOR node.  */
-#define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND_CHECK_CODE (NODE, CONSTRUCTOR, 1)
+#define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND_CHECK_CODE (NODE, CONSTRUCTOR, 0)
 
 /* In ordinary expression nodes.  */
 #define TREE_OPERAND(NODE, I) TREE_OPERAND_CHECK (NODE, I)
diff --git a/gcc/varasm.c b/gcc/varasm.c
index f42f5295f121ab55931ac8b8a4ea9c1d6845b4e8..5b038b263b0ab126d2b3df68b99499d878a2f6ca 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2093,8 +2093,6 @@ decode_addr_const (exp, value)
     case COMPLEX_CST:
     case CONSTRUCTOR:
     case INTEGER_CST:
-      /* This constant should have been output already, but we can't simply
-	 use TREE_CST_RTL since INTEGER_CST doesn't have one.  */
       x = output_constant_def (target, 1);
       break;
 
@@ -2554,7 +2552,6 @@ build_constant_desc (exp)
    If DEFER is nonzero, the output of string constants can be deferred
    and output only if referenced in the function after all optimizations.
 
-   The TREE_CST_RTL of EXP is set up to point to that rtx.
    The const_hash_table records which constants already have label strings.  */
 
 rtx
@@ -2565,12 +2562,6 @@ output_constant_def (exp, defer)
   int hash;
   struct constant_descriptor_tree *desc;
 
-  /* We can't just use the saved RTL if this is a deferred string constant
-     and we are not to defer anymore.  */
-  if (TREE_CST_RTL (exp)
-      && (defer || !STRING_POOL_ADDRESS_P (XEXP (TREE_CST_RTL (exp), 0))))
-    return TREE_CST_RTL (exp);
-
   /* Compute hash code of EXP.  Search the descriptors for that hash code
      to see if any of them describes EXP.  If yes, the descriptor records
      the label number already assigned.  */
@@ -2597,7 +2588,6 @@ output_constant_def (exp, defer)
       maybe_output_constant_def_contents (exp, desc->rtl, 0);
     }
 
-  TREE_CST_RTL (exp) = desc->rtl;
   return desc->rtl;
 }