[PATCH] Fix thinko in build_vector_from_ctor (PR middle-end/69915)
Richard Biener
richard.guenther@gmail.com
Wed Feb 24 12:16:00 GMT 2016
On Tue, Feb 23, 2016 at 9:06 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> This function has changed last year to support embedded VECTOR_CSTs in the
> ctor elements. Before that change, there was no pos var and idx used to
> match exactly the indices in the new vector, but if there is any VECTOR_CST,
> it will fill in more positions.
> Unfortunately, the final loop which zeros in any positions not filled in yet
> has not changed, which is wrong for the case when there were any
> VECTOR_CSTs. E.g. on the testcase, we have a V16HImode type ctor which
> contains two V8HImode VECTOR_CSTs (full of zeros). Each of them fills in
> 8 positions, so the final loop shouldn't add anything, but as idx at that
> point is 2, it will add further 14 elements, resulting in alloca
> buffer overflow.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
Ok.
Thanks,
Richard.
> 2016-02-23 Jakub Jelinek <jakub@redhat.com>
>
> PR middle-end/69915
> * tree.c (build_vector_from_ctor): Fix handling of VECTOR_CST
> elements.
>
> * gcc.dg/pr69915.c: New test.
>
> --- gcc/tree.c.jj 2016-02-08 18:39:17.000000000 +0100
> +++ gcc/tree.c 2016-02-23 15:50:03.566700694 +0100
> @@ -1749,7 +1749,7 @@ build_vector_from_ctor (tree type, vec<c
> else
> vec[pos++] = value;
> }
> - for (; idx < TYPE_VECTOR_SUBPARTS (type); ++idx)
> + while (pos < TYPE_VECTOR_SUBPARTS (type))
> vec[pos++] = build_zero_cst (TREE_TYPE (type));
>
> return build_vector (type, vec);
> --- gcc/testsuite/gcc.dg/pr69915.c.jj 2016-02-23 16:02:09.825732486 +0100
> +++ gcc/testsuite/gcc.dg/pr69915.c 2016-02-23 16:01:47.000000000 +0100
> @@ -0,0 +1,15 @@
> +/* PR middle-end/69915 */
> +/* { dg-do compile } */
> +/* { dg-options "-O -ftracer" } */
> +
> +typedef unsigned short V __attribute__ ((vector_size (32)));
> +
> +unsigned
> +foo (unsigned x, unsigned c, V *p)
> +{
> + V v = *p;
> + if (c < 360)
> + v = (V) { 0 };
> + v *= (V) { x };
> + return v[1];
> +}
>
> Jakub
More information about the Gcc-patches
mailing list