Fix broken handling of LABEL_REF in genrecog + genpreds.
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Wed, 23 Dec 2015 11:06:20 +0000 (11:06 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 23 Dec 2015 11:06:20 +0000 (11:06 +0000)
gcc/ChangeLog

* config/s390/predicates.md ("larl_operand"): Remove now superfluous
const_int and const_double.
* genrecog.c (safe_predicate_mode): Return false for VOIDmode
LABEL_REFs even if the predicate does not handle const_int,
const_double or const_wide_int.
* genpreds.c (add_mode_tests): Treat LABEL_REF like CONST_INT.

From-SVN: r231927

gcc/ChangeLog
gcc/config/s390/predicates.md
gcc/genpreds.c
gcc/genrecog.c

index d67b9c6e399dc6a1063a545bb53905ca107c099c..d01894a58ddf585e926acbf8fffaaf29c49c63d2 100644 (file)
@@ -1,3 +1,12 @@
+2015-12-23  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * config/s390/predicates.md ("larl_operand"): Remove now superfluous
+       const_int and const_double.
+       * genrecog.c (safe_predicate_mode): Return false for VOIDmode
+       LABEL_REFs even if the predicate does not handle const_int,
+       const_double or const_wide_int.
+       * genpreds.c (add_mode_tests): Treat LABEL_REF like CONST_INT.
+
 2015-12-23  Thomas Schwinge  <thomas@codesourcery.com>
 
        * tree-core.h (enum omp_clause_code): Merge OMP_CLAUSE_USE_DEVICE
index 02a1e4e5b7c9b2ac6a3fb43c28357307930f17ac..1211cf01b2c9098198048acf89bff40050f6db69 100644 (file)
 ;;  Return true if OP a valid operand for the LARL instruction.
 
 (define_predicate "larl_operand"
-; Note: Although CONST_INT and CONST_DOUBLE are not handled in this predicate,
-; at least one of them needs to appear or otherwise safe_predicate_mode will
-; assume that a VOIDmode LABEL_REF is not accepted either (see genrecog.c).
-  (match_code "label_ref, symbol_ref, const, const_int, const_double")
+  (match_code "label_ref, symbol_ref, const")
 {
   /* Allow labels and local symbols.  */
   if (GET_CODE (op) == LABEL_REF)
index eac2180e246f9b1d6d4544e91786af34d01abbd2..c82113d2372c8ecf8735ee514c8d23250c7ff24d 100644 (file)
@@ -320,6 +320,8 @@ add_mode_tests (struct pred_data *p)
        {
        case CONST_INT:
        case CONST_WIDE_INT:
+         /* Special handling for (VOIDmode) LABEL_REFs.  */
+       case LABEL_REF:
          matches_const_scalar_int_p = true;
          break;
 
index 599121fb693da4e4388f574ec2538c9bd33f38c2..81ea35be8b431ad7941ddf186eb12ec8c16fc72e 100644 (file)
@@ -3382,7 +3382,8 @@ safe_predicate_mode (const struct pred_data *pred, machine_mode mode)
   if (GET_MODE_CLASS (mode) == MODE_INT
       && (pred->codes[CONST_INT]
          || pred->codes[CONST_DOUBLE]
-         || pred->codes[CONST_WIDE_INT]))
+         || pred->codes[CONST_WIDE_INT]
+         || pred->codes[LABEL_REF]))
     return false;
 
   return !pred->special && mode != VOIDmode;