Hi!

This patch adds verification that vec_select in *.md files
doesn't have any out of bounds indices in the selector.

Bootstrapped/regtested on x86_64-linux and i686-linux, tested
by building cc1 of aarch64, arm, powerpc64le and s390x cross,
and tested by hacking up sse.md to have an out of bounds access there,
ok for trunk?

2017-10-11  Jakub Jelinek  <ja...@redhat.com>

        * genrecog.c (validate_pattern): For VEC_SELECT verify that
        CONST_INT selectors are 0 to GET_MODE_NUNITS (imode) - 1.

--- gcc/genrecog.c.jj   2017-09-01 09:25:40.000000000 +0200
+++ gcc/genrecog.c      2017-10-11 17:53:20.107198630 +0200
@@ -751,6 +751,21 @@ validate_pattern (rtx pattern, md_rtx_in
                error_at (info->loc,
                          "vec_select parallel with %d elements, expected %d",
                          XVECLEN (XEXP (pattern, 1), 0), expected);
+             else if (VECTOR_MODE_P (imode))
+               {
+                 unsigned int nelems = GET_MODE_NUNITS (imode);
+                 int i;
+                 for (i = 0; i < expected; ++i)
+                   if (CONST_INT_P (XVECEXP (XEXP (pattern, 1), 0, i))
+                       && (UINTVAL (XVECEXP (XEXP (pattern, 1), 0, i))
+                           >= nelems))
+                     error_at (info->loc,
+                               "out of bounds selector %u in vec_select, "
+                               "expected at most %u",
+                               (unsigned)
+                               UINTVAL (XVECEXP (XEXP (pattern, 1), 0, i)),
+                               nelems - 1);
+               }
            }
          if (imode != VOIDmode && !VECTOR_MODE_P (imode))
            error_at (info->loc, "%smode of first vec_select operand is not a "

        Jakub

Reply via email to