If the memory constraint definition includes (match_code "MEM"), then
the subsequent 'op' is undoubtedly MEM rtx, and all that remains is to
determine if 'XEXP (op, 0)' is the address corresponding to that
definition using (match_test "...").

This patch eliminates the need to call MEM_P() again in the predicate
function called from (match_test "...") in the memory constraint
definitions.

gcc/ChangeLog:

        * config/xtensa/xtensa.cc (smalloffset_mem_p):
        Rename it to smalloffset_address_p and remove the result check
        of MEM_P().
        (constantpool_address_p): Change from static scope to global.
        * config/xtensa/xtensa-protos.h (smalloffset_mem_p):
        Rename it to smalloffset_address_p.
        (constantpool_address_p): New function prototype.
        * config/xtensa/constraints.md (R):
        Change the call in (match_test "...") from smalloffset_mem_p()
        to smalloffset_address_p().
        (T, U): Change the call in (match_test "...") from
        constantpool_mem_p() to constantpool_address_p().
---
 gcc/config/xtensa/constraints.md  |  6 ++---
 gcc/config/xtensa/xtensa-protos.h |  3 ++-
 gcc/config/xtensa/xtensa.cc       | 40 +++++++++++++++----------------
 3 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/gcc/config/xtensa/constraints.md b/gcc/config/xtensa/constraints.md
index 5cf2f198c5f..81305074b64 100644
--- a/gcc/config/xtensa/constraints.md
+++ b/gcc/config/xtensa/constraints.md
@@ -129,14 +129,14 @@
 (define_special_memory_constraint "R"
  "Memory that can be accessed with a 4-bit unsigned offset from a register."
  (and (match_code "mem")
-      (match_test "smalloffset_mem_p (op)")))
+      (match_test "smalloffset_address_p (XEXP (op, 0))")))
(define_special_memory_constraint "T"
  "Memory in a literal pool (addressable with an L32R instruction)."
  (and (match_code "mem")
-      (match_test "!TARGET_CONST16 && constantpool_mem_p (op)")))
+      (match_test "!TARGET_CONST16 && constantpool_address_p (XEXP (op, 0))")))
(define_special_memory_constraint "U"
  "Memory that is not in a literal pool."
  (and (match_code "mem")
-      (match_test "! constantpool_mem_p (op)")))
+      (match_test "! constantpool_address_p (XEXP (op, 0))")))
diff --git a/gcc/config/xtensa/xtensa-protos.h 
b/gcc/config/xtensa/xtensa-protos.h
index f41f32f18ac..034549b61e0 100644
--- a/gcc/config/xtensa/xtensa-protos.h
+++ b/gcc/config/xtensa/xtensa-protos.h
@@ -35,7 +35,8 @@ extern bool xtensa_mem_offset (unsigned, machine_mode);
 #ifdef RTX_CODE
 extern int xt_true_regnum (rtx);
 extern int xtensa_valid_move (machine_mode, rtx *);
-extern int smalloffset_mem_p (rtx);
+extern bool smalloffset_address_p (const_rtx);
+extern bool constantpool_address_p (const_rtx);
 extern int constantpool_mem_p (rtx);
 extern void xtensa_extend_reg (rtx, rtx);
 extern void xtensa_expand_conditional_branch (rtx *, machine_mode);
diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 235b4e0446d..dbbea0799da 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -165,7 +165,6 @@ static reg_class_t xtensa_secondary_reload (bool, rtx, 
reg_class_t,
                                            machine_mode,
                                            struct secondary_reload_info *);
-static bool constantpool_address_p (const_rtx addr);
 static bool xtensa_legitimate_constant_p (machine_mode, rtx);
 static void xtensa_reorg (void);
 static bool xtensa_can_use_doloop_p (const widest_int &, const widest_int &,
@@ -563,32 +562,31 @@ xtensa_valid_move (machine_mode mode, rtx *operands)
 }
-int
-smalloffset_mem_p (rtx op)
+bool
+smalloffset_address_p (const_rtx addr)
 {
-  if (MEM_P (op))
+  if (REG_P (addr))
+    return BASE_REG_P (addr, 0);
+
+  if (GET_CODE (addr) == PLUS)
     {
-      rtx addr = XEXP (op, 0);
-      if (REG_P (addr))
-       return BASE_REG_P (addr, 0);
-      if (GET_CODE (addr) == PLUS)
-       {
-         rtx offset = XEXP (addr, 0);
-         HOST_WIDE_INT val;
-         if (! CONST_INT_P (offset))
-           offset = XEXP (addr, 1);
-         if (! CONST_INT_P (offset))
-           return FALSE;
-
-         val = INTVAL (offset);
-         return (val & 3) == 0 && IN_RANGE (val, 0, 60);
-       }
+      rtx offset = XEXP (addr, 0);
+      HOST_WIDE_INT val;
+
+      if (! CONST_INT_P (offset))
+       offset = XEXP (addr, 1);
+      if (! CONST_INT_P (offset))
+       return false;
+
+      val = INTVAL (offset);
+      return (val & 3) == 0 && IN_RANGE (val, 0, 60);
     }
-  return FALSE;
+
+  return false;
 }
-static bool
+bool
 constantpool_address_p (const_rtx addr)
 {
   const_rtx sym = addr;
--
2.39.5

Reply via email to