genrecog.c (special_predicate_operand_p): New function.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 13 Jul 2016 22:18:40 +0000 (23:18 +0100)
committerJeff Law <law@gcc.gnu.org>
Wed, 13 Jul 2016 22:18:40 +0000 (16:18 -0600)
* genrecog.c (special_predicate_operand_p): New function.
(predicate_name): Move function.
(validate_pattern): Don't warn about missing mode for all
define_special_predicate predicates.

From-SVN: r238314

gcc/ChangeLog
gcc/genrecog.c

index 2862d0ed15f759b36e95a4171300093d7191cb6b..786e899046d8c0c1806d0273a15254eccba4b0c0 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-13  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * genrecog.c (special_predicate_operand_p): New function.
+       (predicate_name): Move function.
+       (validate_pattern): Don't warn about missing mode for all
+       define_special_predicate predicates.
+
 2016-07-13  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-vect-data-refs.c (vect_no_alias_p): New function.
index a9f5a4a1300c390e50625c1c30b6c258108b995b..056798c82f7a7719e0a14ccec4156a3f6c21793f 100644 (file)
@@ -463,6 +463,38 @@ constraints_supported_in_insn_p (rtx insn)
           || GET_CODE (insn) == DEFINE_PEEPHOLE2);
 }
 
+/* Return the name of the predicate matched by MATCH_RTX.  */
+
+static const char *
+predicate_name (rtx match_rtx)
+{
+  if (GET_CODE (match_rtx) == MATCH_SCRATCH)
+    return "scratch_operand";
+  else
+    return XSTR (match_rtx, 1);
+}
+
+/* Return true if OPERAND is a MATCH_OPERAND using a special predicate
+   function.  */
+
+static bool
+special_predicate_operand_p (rtx operand)
+{
+  if (GET_CODE (operand) == MATCH_OPERAND)
+    {
+      const char *pred_name = predicate_name (operand);
+      if (pred_name[0] != 0)
+       {
+         const struct pred_data *pred;
+
+         pred = lookup_predicate (pred_name);
+         return pred != NULL && pred->special;
+       }
+    }
+
+  return false;
+}
+
 /* Check for various errors in PATTERN, which is part of INFO.
    SET is nonnull for a destination, and is the complete set pattern.
    SET_CODE is '=' for normal sets, and '+' within a context that
@@ -651,10 +683,9 @@ validate_pattern (rtx pattern, md_rtx_info *info, rtx set, int set_code)
        dmode = GET_MODE (dest);
        smode = GET_MODE (src);
 
-       /* The mode of an ADDRESS_OPERAND is the mode of the memory
-          reference, not the mode of the address.  */
-       if (GET_CODE (src) == MATCH_OPERAND
-           && ! strcmp (XSTR (src, 1), "address_operand"))
+       /* Mode checking is not performed for special predicates.  */
+       if (special_predicate_operand_p (src)
+           || special_predicate_operand_p (dest))
          ;
 
         /* The operands of a SET must have the same mode unless one
@@ -3788,17 +3819,6 @@ operator < (const pattern_pos &e1, const pattern_pos &e2)
   return diff < 0;
 }
 
-/* Return the name of the predicate matched by MATCH_RTX.  */
-
-static const char *
-predicate_name (rtx match_rtx)
-{
-  if (GET_CODE (match_rtx) == MATCH_SCRATCH)
-    return "scratch_operand";
-  else
-    return XSTR (match_rtx, 1);
-}
-
 /* Add new decisions to S that check whether the rtx at position POS
    matches PATTERN.  Return the state that is reached in that case.
    TOP_PATTERN is the overall pattern, as passed to match_pattern_1.  */