re PR target/16298 (ICE in output_operand)
authorRichard Henderson <rth@redhat.com>
Tue, 24 Aug 2004 21:45:59 +0000 (14:45 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 24 Aug 2004 21:45:59 +0000 (14:45 -0700)
        PR target/16298
        * config/i386/i386.c (legitimate_constant_p): Rework to not accept
        random codes within CONST.

From-SVN: r86522

gcc/ChangeLog
gcc/config/i386/i386.c

index ede940ec26b3983fc29fcaf46448be93844cf35e..e52036f9ddacab500356991232adb26c3fc078a1 100644 (file)
@@ -1,3 +1,9 @@
+2004-08-24  Richard Henderson  <rth@redhat.com>
+
+       PR target/16298
+       * config/i386/i386.c (legitimate_constant_p): Rework to not accept
+       random codes within CONST.
+
 2004-08-24  James E Wilson  <wilson@specifixinc.com>
 
        * Makefile.in (STAGEFEEDBACK_FLAGS_TO_PASS): Remove
index 22a062d6fd7283121b9d7b40e9b8872f237e5a03..53ed7f1db5dcf704b95c8e3d1c54f548fa718cfa 100644 (file)
@@ -4824,54 +4824,43 @@ darwin_local_data_pic (rtx disp)
 bool
 legitimate_constant_p (rtx x)
 {
-  rtx inner;
-
   switch (GET_CODE (x))
     {
-    case SYMBOL_REF:
-      /* TLS symbols are not constant.  */
-      if (tls_symbolic_operand (x, Pmode))
-       return false;
-      break;
-
     case CONST:
-      inner = XEXP (x, 0);
-
-      /* Offsets of TLS symbols are never valid.
-        Discourage CSE from creating them.  */
-      if (GET_CODE (inner) == PLUS
-         && tls_symbolic_operand (XEXP (inner, 0), Pmode))
-       return false;
+      x = XEXP (x, 0);
 
-      if (GET_CODE (inner) == PLUS)
+      if (GET_CODE (x) == PLUS)
        {
-         if (GET_CODE (XEXP (inner, 1)) != CONST_INT)
+         if (GET_CODE (XEXP (x, 1)) != CONST_INT)
            return false;
-         inner = XEXP (inner, 0);
+         x = XEXP (x, 0);
        }
 
-      if (TARGET_MACHO && darwin_local_data_pic (inner))
+      if (TARGET_MACHO && darwin_local_data_pic (x))
        return true;
 
-      if (GET_CODE (inner) == MINUS)
-       {
-         if (GET_CODE (XEXP (inner, 1)) != CONST_INT)
-           return false;
-         inner = XEXP (inner, 0);
-       }
-
       /* Only some unspecs are valid as "constants".  */
-      if (GET_CODE (inner) == UNSPEC)
-       switch (XINT (inner, 1))
+      if (GET_CODE (x) == UNSPEC)
+       switch (XINT (x, 1))
          {
          case UNSPEC_TPOFF:
          case UNSPEC_NTPOFF:
-           return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
+           return local_exec_symbolic_operand (XVECEXP (x, 0, 0), Pmode);
          case UNSPEC_DTPOFF:
-           return local_dynamic_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
+           return local_dynamic_symbolic_operand (XVECEXP (x, 0, 0), Pmode);
          default:
            return false;
          }
+
+      /* We must have drilled down to a symbol.  */
+      if (!symbolic_operand (x, Pmode))
+       return false;
+      /* FALLTHRU */
+
+    case SYMBOL_REF:
+      /* TLS symbols are never valid.  */
+      if (tls_symbolic_operand (x, Pmode))
+       return false;
       break;
 
     default: