Fix bug in constraint-check generator, reported by Rask Ingemann Lambertsen:
authorZack Weinberg <zack@gcc.gnu.org>
Wed, 4 Oct 2006 16:41:55 +0000 (16:41 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Wed, 4 Oct 2006 16:41:55 +0000 (16:41 +0000)
Fix bug in constraint-check generator, reported by Rask Ingemann
Lambertsen:
* genpreds.c (add_constraint): Don't remove anything from the
expression here.
(write_tm_constrs_h): Detect whether "op" argument is used, and
mark it ARG_UNUSED if it isn't.
(write_insn_const_int_ok_for_constraint): Skip the part of the
expression that would test whether "op" (which is not available
here) is a CONST_INT.

From-SVN: r117433

gcc/ChangeLog
gcc/genpreds.c

index 6cb1973c0eeb1406c07ef6f54322c02c3ff09cc9..209ab0d63d9ee9a3e90f151ee62e630953621ca4 100644 (file)
@@ -1,3 +1,15 @@
+2006-10-04  Zack Weinberg  <zackw@panix.com>
+
+       Fix bug in constraint-check generator, reported by Rask Ingemann
+       Lambertsen:
+       * genpreds.c (add_constraint): Don't remove anything from the
+       expression here.
+       (write_tm_constrs_h): Detect whether "op" argument is used, and
+       mark it ARG_UNUSED if it isn't.
+       (write_insn_const_int_ok_for_constraint): Skip the part of the
+       expression that would test whether "op" (which is not available
+       here) is a CONST_INT.
+
 2006-10-04  Ryan Mansfield  <rmansfield@qnx.com>
 
        PR c++/28448
@@ -42,7 +54,7 @@
 2006-10-01  Ryan Mansfield  <rmansfield@qnx.com>
 
        PR c/20533
-       * doc/extend.texi: Add used variable attribute description. 
+       * doc/extend.texi: Add used variable attribute description.
 
 2006-09-30  Joseph S. Myers  <joseph@codesourcery.com>
 
        range of a REG_DEAD register.
 
 2006-18-05  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
-            Anatoly Sokolov <aesok@post.ru>
+           Anatoly Sokolov <aesok@post.ru>
 
        * config/avr/avr.c (avr_mcu_types): Add support for attiny261,
        attiny461, attiny861, attiny25, attiny45, attiny85, attiny24,
        * config/pa/pa-linux.h (STRING_ASM_OP): Prepend and append a tab.
 
 2006-05-19  Daniel Berlin  <dberlin@dberlin.org>
-            Kenneth Zadeck <zadeck@naturalbridge.com>
+           Kenneth Zadeck <zadeck@naturalbridge.com>
 
        PR rtl-optimization/26855
 
 2006-04-04  Matthias Klose  <doko@debian.org>
 
        * Makefile.in (unprotoize.o): Same dependencies as for protoize.o.
-       
+
        PR bootstrap/26764
        PR bootstrap/27334
        * Makefile.in (s-macro_list): Conform to POSIX rules in single quoted
index adc3e48372b0ef198534319a763539137ea2dc18..535c9ddde772b9a516b0dffb91c7ef682a539645 100644 (file)
@@ -891,10 +891,6 @@ add_constraint (const char *name, const char *regclass,
          have_error = 1;
          return;
        }
-
-      /* Remove the redundant (and (match_code "const_(int|double)")
-        from the expression.  */
-      exp = XEXP (exp, 1);
     }
 
   
@@ -1078,10 +1074,13 @@ write_tm_constrs_h (void)
        bool needs_rval = needs_variable (c->exp, "rval");
        bool needs_mode = (needs_variable (c->exp, "mode")
                           || needs_hval || needs_lval || needs_rval);
+       bool needs_op = (needs_variable (c->exp, "op")
+                        || needs_ival || needs_mode);
 
        printf ("static inline bool\n"
-               "satisfies_constraint_%s (rtx op)\n"
-               "{\n", c->c_name);
+               "satisfies_constraint_%s (rtx %s)\n"
+               "{\n", c->c_name,
+               needs_op ? "op" : "ARG_UNUSED (op)");
        if (needs_mode)
          puts ("enum machine_mode mode = GET_MODE (op);");
        if (needs_ival)
@@ -1157,7 +1156,10 @@ write_insn_const_int_ok_for_constraint (void)
     if (c->is_const_int)
       {
        printf ("    case CONSTRAINT_%s:\n      return ", c->c_name);
-       write_predicate_expr (c->exp);
+       /* c->exp is guaranteed to be (and (match_code "const_int") (...));
+          we know at this point that we have a const_int, so we need not
+          bother with that part of the test.  */
+       write_predicate_expr (XEXP (c->exp, 1));
        fputs (";\n\n", stdout);
       }