varasm.c (struct rtx_const): Change type of un.addr member to struct holding an addit...
authorUlrich Weigand <uweigand@de.ibm.com>
Sat, 15 Mar 2003 16:30:35 +0000 (16:30 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Sat, 15 Mar 2003 16:30:35 +0000 (16:30 +0000)
* varasm.c (struct rtx_const): Change type of un.addr member
to struct holding an additional 'symbol' member.
(decode_rtx_const): Re-enable optimization to count SYMBOL_REFs
with equal string addresses as equal.
(simplify_subtraction): Adapt to struct rtx_const change.

From-SVN: r64406

gcc/ChangeLog
gcc/varasm.c

index b42a3921b80de2f818f8f7dcff6de233dd69481b..b2ffd69800f3a810d48a514f9ae931b66cf4e5c5 100644 (file)
@@ -1,3 +1,11 @@
+2003-03-15  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * varasm.c (struct rtx_const): Change type of un.addr member
+       to struct holding an additional 'symbol' member.
+       (decode_rtx_const): Re-enable optimization to count SYMBOL_REFs
+       with equal string addresses as equal.
+       (simplify_subtraction): Adapt to struct rtx_const change.
+
 2003-03-15  Neil Booth  <neil@daikokuya.co.uk>
 
        * fix-header.c (read_scan_file): Read main file before handling -D.
index 42775dca5bc692b0e6bae5ed4685f693b58e6dd5..fc6f467a04fc4972b12075bb5e0430648ecd2ef3 100644 (file)
@@ -2115,7 +2115,11 @@ struct rtx_const GTY(())
   ENUM_BITFIELD(machine_mode) mode : 16;
   union rtx_const_un {
     REAL_VALUE_TYPE GTY ((tag ("4"))) du;
-    struct addr_const GTY ((tag ("1"))) addr;
+    struct rtx_const_u_addr {
+      rtx base;
+      const char *symbol;
+      HOST_WIDE_INT offset;
+    } GTY ((tag ("1"))) addr;
     struct rtx_const_u_di {
       HOST_WIDE_INT high;
       HOST_WIDE_INT low;
@@ -3045,13 +3049,12 @@ decode_rtx_const (mode, x, value)
   if (value->kind >= RTX_INT && value->un.addr.base != 0)
     switch (GET_CODE (value->un.addr.base))
       {
-#if 0
       case SYMBOL_REF:
        /* Use the string's address, not the SYMBOL_REF's address,
           for the sake of addresses of library routines.  */
-       value->un.addr.base = (rtx) XSTR (value->un.addr.base, 0);
+       value->un.addr.symbol = XSTR (value->un.addr.base, 0);
+       value->un.addr.base = NULL_RTX;
        break;
-#endif
 
       case LABEL_REF:
        /* For a LABEL_REF, compare labels.  */
@@ -3076,7 +3079,8 @@ simplify_subtraction (x)
 
   if (val0.kind >= RTX_INT
       && val0.kind == val1.kind
-      && val0.un.addr.base == val1.un.addr.base)
+      && val0.un.addr.base == val1.un.addr.base
+      && val0.un.addr.symbol == val1.un.addr.symbol)
     return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
 
   return x;