expr.c (expand_expr <COMPLEX_CST, [...]): Always call output_constant_def, use its...
authorZack Weinberg <zack@codesourcery.com>
Mon, 28 Apr 2003 04:13:48 +0000 (04:13 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Mon, 28 Apr 2003 04:13:48 +0000 (04:13 +0000)
        * expr.c (expand_expr <COMPLEX_CST, STRING_CST>): Always call
        output_constant_def, use its result instead of TREE_CST_RTL (exp).
        Can assume it has the form (mem (symbol_ref ".LCxxx")).
        (expand_expr <COMPONENT_REF>): Can always just extract the
        relevant field of a CONSTRUCTOR.
        (expand_expr <ARRAY_REF, COMPONENT_REF, BIT_FIELD_REF,
        ARRAY_RANGE_REF>): Make control flow explicit.
        * varasm.c (output_constant_def): Can look at TREE_CST_RTL of
        an INTEGER_CST.

From-SVN: r66148

gcc/ChangeLog
gcc/expr.c
gcc/varasm.c

index 9b48e5dcc6d2ef758f36d68159d7086a9d4794f1..611b3acf9d42fd890f6210d818195eff319a11fa 100644 (file)
@@ -1,3 +1,15 @@
+2003-04-27  Zack Weinberg  <zack@codesourcery.com>
+
+       * expr.c (expand_expr <COMPLEX_CST, STRING_CST>): Always call
+       output_constant_def, use its result instead of TREE_CST_RTL (exp).
+       Can assume it has the form (mem (symbol_ref ".LCxxx")).
+       (expand_expr <COMPONENT_REF>): Can always just extract the
+       relevant field of a CONSTRUCTOR.
+       (expand_expr <ARRAY_REF, COMPONENT_REF, BIT_FIELD_REF,
+       ARRAY_RANGE_REF>): Make control flow explicit.
+       * varasm.c (output_constant_def): Can look at TREE_CST_RTL of
+       an INTEGER_CST.
+
 2003-04-27  Kazu Hirata  <kazu@cs.umass.edu>
 
        * reload1.c (reg_set_luid): Fix a comment typo.
index 6488a8088b38a8cf929937ab04b09be2766a5784..0d6118778b80827c636f151d7a183ac6cd7253f9 100644 (file)
@@ -6872,22 +6872,19 @@ expand_expr (exp, target, tmode, modifier)
 
     case COMPLEX_CST:
     case STRING_CST:
-      if (! TREE_CST_RTL (exp))
-       output_constant_def (exp, 1);
+      temp = output_constant_def (exp, 1);
 
-      /* TREE_CST_RTL probably contains a constant address.
+      /* temp contains a constant address.
         On RISC machines where a constant address isn't valid,
         make some insns to get that address into a register.  */
-      if (GET_CODE (TREE_CST_RTL (exp)) == MEM
-         && modifier != EXPAND_CONST_ADDRESS
+      if (modifier != EXPAND_CONST_ADDRESS
          && modifier != EXPAND_INITIALIZER
          && modifier != EXPAND_SUM
-         && (! memory_address_p (mode, XEXP (TREE_CST_RTL (exp), 0))
-             || (flag_force_addr
-                 && GET_CODE (XEXP (TREE_CST_RTL (exp), 0)) != REG)))
-       return replace_equiv_address (TREE_CST_RTL (exp),
-                                     copy_rtx (XEXP (TREE_CST_RTL (exp), 0)));
-      return TREE_CST_RTL (exp);
+         && (! memory_address_p (mode, XEXP (temp, 0))
+             || flag_force_addr))
+       return replace_equiv_address (temp,
+                                     copy_rtx (XEXP (temp, 0)));
+      return temp;
 
     case EXPR_WITH_FILE_LOCATION:
       {
@@ -7300,18 +7297,12 @@ expand_expr (exp, target, tmode, modifier)
              }
          }
       }
-      /* Fall through.  */
+      goto normal_inner_ref;
 
     case COMPONENT_REF:
-    case BIT_FIELD_REF:
-    case ARRAY_RANGE_REF:
       /* If the operand is a CONSTRUCTOR, we can just extract the
-        appropriate field if it is present.  Don't do this if we have
-        already written the data since we want to refer to that copy
-        and varasm.c assumes that's what we'll do.  */
-      if (code == COMPONENT_REF
-         && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR
-         && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0)
+        appropriate field if it is present.  */
+      if (TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR)
        {
          tree elt;
 
@@ -7363,7 +7354,11 @@ expand_expr (exp, target, tmode, modifier)
                return op0;
              }
        }
+      goto normal_inner_ref;
 
+    case BIT_FIELD_REF:
+    case ARRAY_RANGE_REF:
+    normal_inner_ref:
       {
        enum machine_mode mode1;
        HOST_WIDE_INT bitsize, bitpos;
index 27c7843d2c34df94bda2fec543f9d04067c56c9d..f42f5295f121ab55931ac8b8a4ea9c1d6845b4e8 100644 (file)
@@ -2567,7 +2567,7 @@ output_constant_def (exp, defer)
 
   /* We can't just use the saved RTL if this is a deferred string constant
      and we are not to defer anymore.  */
-  if (TREE_CODE (exp) != INTEGER_CST && TREE_CST_RTL (exp)
+  if (TREE_CST_RTL (exp)
       && (defer || !STRING_POOL_ADDRESS_P (XEXP (TREE_CST_RTL (exp), 0))))
     return TREE_CST_RTL (exp);