]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* recog.c (constrain_operands): Validate mem operands.
authorRichard Henderson <rth@redhat.com>
Sat, 10 Jan 2004 03:17:30 +0000 (19:17 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 10 Jan 2004 03:17:30 +0000 (19:17 -0800)
From-SVN: r75625

gcc/ChangeLog
gcc/recog.c

index 128baf72077a238bad04ae6bf59b8515e2dfd4ce..e1fe55f7eb1ae3dcdfe0cfd98b9e164e40d9bad9 100644 (file)
@@ -1,3 +1,7 @@
+2004-01-09  Richard Henderson  <rth@redhat.com>
+
+       * recog.c (constrain_operands): Validate mem operands.
+
 2004-01-02  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        PR target/13069
index 8218a88451ac25ff94055ea9def9d20dfc281252..dd080ddbfd3c5de807209926654b6aa44c8ecf08 100644 (file)
@@ -2515,12 +2515,25 @@ constrain_operands (strict)
                break;
 
              case 'm':
-               if (GET_CODE (op) == MEM
-                   /* Before reload, accept what reload can turn into mem.  */
-                   || (strict < 0 && CONSTANT_P (op))
-                   /* During reload, accept a pseudo  */
-                   || (reload_in_progress && GET_CODE (op) == REG
-                       && REGNO (op) >= FIRST_PSEUDO_REGISTER))
+               /* Memory operands must be valid, to the extent
+                  required by STRICT.  */
+               if (GET_CODE (op) == MEM)
+                 {
+                   if (strict > 0
+                       && !strict_memory_address_p (GET_MODE (op),
+                                                    XEXP (op, 0)))
+                     break;
+                   if (strict == 0
+                       && !memory_address_p (GET_MODE (op), XEXP (op, 0)))
+                     break;
+                   win = 1;
+                 }
+               /* Before reload, accept what reload can turn into mem.  */
+               else if (strict < 0 && CONSTANT_P (op))
+                 win = 1;
+               /* During reload, accept a pseudo  */
+               else if (reload_in_progress && GET_CODE (op) == REG
+                        && REGNO (op) >= FIRST_PSEUDO_REGISTER)
                  win = 1;
                break;