OSDN Git Service

* varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in
authorhpenner <hpenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Feb 2002 08:29:08 +0000 (08:29 +0000)
committerhpenner <hpenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Feb 2002 08:29:08 +0000 (08:29 +0000)
     constant pool to be identical by string address and index.

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

gcc/ChangeLog
gcc/varasm.c

index babb0e4..1b6153b 100644 (file)
@@ -1,3 +1,8 @@
+2002-02-04  Hartmut Penner  <hpenner@de.ibm.com>
+
+        * varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in
+        constant pool to be identical by string address and index.
+
 2002-02-04  Anthony Green  <green@redhat.com>
 
        * output.h (SECTION_OVERRIDE): Define.
index 8bd5807..18d2008 100644 (file)
@@ -2382,7 +2382,7 @@ decode_addr_const (exp, value)
   value->offset = offset;
 }
 \f
-enum kind { RTX_DOUBLE, RTX_INT };
+enum kind { RTX_DOUBLE, RTX_INT, RTX_UNSPEC };
 struct rtx_const
 {
   ENUM_BITFIELD(kind) kind : 16;
@@ -3613,7 +3613,24 @@ decode_rtx_const (mode, x, value)
       abort ();
     }
 
-  if (value->kind == RTX_INT && value->un.addr.base != 0)
+  if (value->kind == RTX_INT && value->un.addr.base != 0
+      && GET_CODE (value->un.addr.base) == UNSPEC)
+    {      
+      /* For a simple UNSPEC, the base is set to the
+        operand, the kind field is set to the index of
+        the unspec expression. 
+        Together with the code below, in case that
+        the operand is a SYMBOL_REF or LABEL_REF, 
+        the address of the string or the code_label 
+        is taken as base.  */
+      if (XVECLEN (value->un.addr.base, 0) == 1)
+        {
+         value->kind = RTX_UNSPEC + XINT (value->un.addr.base, 1);
+         value->un.addr.base = XVECEXP (value->un.addr.base, 0, 0);
+       }
+    }
+
+  if (value->kind != RTX_DOUBLE && value->un.addr.base != 0)
     switch (GET_CODE (value->un.addr.base))
       {
       case SYMBOL_REF:
@@ -3643,7 +3660,8 @@ simplify_subtraction (x)
   decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
   decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
 
-  if (val0.un.addr.base == val1.un.addr.base)
+  if (val0.kind != RTX_DOUBLE && val0.kind == val1.kind
+      && val0.un.addr.base == val1.un.addr.base)
     return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
   return x;
 }