https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83969

Peter Bergner <bergner at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bergner at gcc dot gnu.org

--- Comment #10 from Peter Bergner <bergner at gcc dot gnu.org> ---
This looks like a similar bug I fixed in PR84279, namely mem_operand_gpr()
accepting addresses that are not offsettable.

In this specific bug, we don't have an altivec address, but we do have an index
address which also should be rejected for the "Y" constraint.  Replacing the
fix for PR84279 with a test for offsettable_address_p() instead fixes both
ICEs.  I'm testing the following patch which mimics the code for
mem_operand_ds_form():

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c  (revision 258267)
+++ gcc/config/rs6000/rs6000.c  (working copy)
@@ -8207,10 +8207,8 @@ mem_operand_gpr (rtx op, machine_mode mo
   int extra;
   rtx addr = XEXP (op, 0);

-  /* Don't allow altivec type addresses like (mem (and (plus ...))).
-     See PR target/84279.  */
-
-  if (GET_CODE (addr) == AND)
+  /* Don't allow non-offsettable addresses.  See PRs 83969 and 84279.  */
+  if (!offsettable_address_p (false, mode, addr))
     return false;

   op = address_offset (addr);

Reply via email to