On Wed, Mar 30, 2011 at 08:02:38AM -0700, H.J. Lu wrote:
> Hi,
> 
> Currently, we limit XVECEXP to 26 elements in machine description
> since we use letters 'a' to 'z' to encode them.  I don't see any
> reason why we can't go beyond 'z'.  This patch removes this restriction.
> Any comments?
> 

That was wrong.  The problem is in vector elements.  This patch passes
bootstrap.  Any comments?

Thanks.


H.J.
---
2011-03-30  H.J. Lu  <hongjiu...@intel.com>

        * genrecog.c (VECTOR_ELEMENT_BASE): New.
        (add_to_sequence): Add assert.  Use VECTOR_ELEMENT_BASE to
        encode vector elements.
        (change_state): Check and support VECTOR_ELEMENT_BASE.
        (make_insn_sequence): Add assert.

diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index 74dd0a7..40e9c4d 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -465,6 +465,9 @@ extern void debug_decision
   (struct decision *);
 extern void debug_decision_list
   (struct decision *);
+
+/* The base of vector element.  */
+#define VECTOR_ELEMENT_BASE 0x80
 
 /* Create a new node in sequence after LAST.  */
 
@@ -912,6 +915,7 @@ add_to_sequence (rtx pattern, struct decision_head *last, 
const char *position,
              /* Which insn we're looking at is represented by A-Z. We don't
                 ever use 'A', however; it is always implied.  */
 
+             gcc_assert (i < 26);
              subpos[depth] = (i > 0 ? 'A' + i : 0);
              sub = add_to_sequence (XVECEXP (pattern, 0, i),
                                     last, subpos, insn_type, 0);
@@ -1002,6 +1006,9 @@ add_to_sequence (rtx pattern, struct decision_head *last, 
const char *position,
            char base = (was_code == MATCH_OPERATOR ? '0' : 'a');
            for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++)
              {
+               gcc_assert (was_code == MATCH_OPERATOR
+                           ? ISDIGIT (i + base)
+                           : ISLOWER (i + base));
                subpos[depth] = i + base;
                sub = add_to_sequence (XVECEXP (pattern, 2, i),
                                       &sub->success, subpos, insn_type, 0);
@@ -1102,7 +1109,9 @@ add_to_sequence (rtx pattern, struct decision_head *last, 
const char *position,
            int j;
            for (j = 0; j < XVECLEN (pattern, i); j++)
              {
-               subpos[depth] = 'a' + j;
+               int val = j + VECTOR_ELEMENT_BASE;
+               gcc_assert (val <= UCHAR_MAX);
+               subpos[depth] = val;
                sub = add_to_sequence (XVECEXP (pattern, i, j),
                                       &sub->success, subpos, insn_type, 0);
              }
@@ -1779,6 +1788,10 @@ change_state (const char *oldpos, const char *newpos, 
const char *indent)
       else if (ISLOWER (newpos[depth]))
        printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
                indent, depth + 1, depth, newpos[depth] - 'a');
+      else if (((unsigned char) newpos[depth]) >= VECTOR_ELEMENT_BASE)
+       printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
+               indent, depth + 1, depth,
+               ((unsigned char) newpos[depth]) - VECTOR_ELEMENT_BASE);
       else
        printf ("%sx%d = XEXP (x%d, %c);\n",
                indent, depth + 1, depth, newpos[depth]);
@@ -2528,6 +2541,7 @@ make_insn_sequence (rtx insn, enum routine_type type)
        }
       XVECLEN (x, 0) = j;
 
+      gcc_assert ((j - 1) < 26);
       c_test_pos[0] = 'A' + j - 1;
       c_test_pos[1] = '\0';
     }

Reply via email to