This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix and testcases for pr72747


On Fri, Oct 28, 2016 at 4:06 PM, Will Schmidt <will_schmidt@vnet.ibm.com> wrote:
> On Fri, 2016-10-28 at 08:31 -0500, Will Schmidt wrote:
>> On Fri, 2016-10-28 at 10:38 +0200, Richard Biener wrote:
>> > On Thu, Oct 27, 2016 at 5:37 PM, Will Schmidt <will_schmidt@vnet.ibm.com> wrote:
>> > > Hi,
>> > >
>> > > Per PR72747, A statement such as "v = vec_splats (1);" correctly
>> > > initializes a vector.  However, a statement such as "v[1] = v[0] =
>> > > vec_splats (1);" initializes both v[1] and v[0] to random garbage.
>> > >
>> > > It has been determined that this is occurring because we did not emit
>> > > the actual initialization statement before our final exit from
>> > > gimplify_init_constructor, at which time we lose the expression when we
>> > > assign *expr_p to either NULL or object.  This problem affected both constant
>> > > and non-constant initializers.  Corrected this by moving the logic to
>> > > emit the statement up earlier within the if/else logic.
>> > >
>> > > Bootstrapped and make check ran without regressions on
>> > > powerpc64le-unknown-linux-gnu.
>> > >
>> > > OK for trunk?
>> >
>> > Ok.
>> >
>> > RIchard.
>>
>> Committed revision 241647.
>> Thanks.
>
> Oops, forgot to ask.  After some burn-in time, is this OK to backport to
> the 5 and 6 branches?

Yes.

Richard.

> The bug was first noticed in GCC 5.
>
> Thanks,
> -Will
>
>>
>>
>> >
>> > > Thanks,
>> > > -Will
>> > >
>> > > gcc:
>> > > 2016-10-26  Will Schmidt <will_schmidt@vnet.ibm.com>
>> > >
>> > >         PR middle-end/72747
>> > >         * gimplify.c (gimplify_init_constructor): Move emit of constructor
>> > >         assignment to earlier in the if/else logic.
>> > >
>> > > testsuite:
>> > > 2016-10-26  Will Schmidt <will_schmidt@vnet.ibm.com>
>> > >
>> > >         PR middle-end/72747
>> > >         * c-c++-common/pr72747-1.c: New test.
>> > >         * c-c++-common/pr72747-2.c: Likewise.
>> > >
>> > > Index: gcc/gimplify.c
>> > > ===================================================================
>> > > --- gcc/gimplify.c      (revision 241600)
>> > > +++ gcc/gimplify.c      (working copy)
>> > > @@ -4730,24 +4730,23 @@
>> > >
>> > >    if (ret == GS_ERROR)
>> > >      return GS_ERROR;
>> > > -  else if (want_value)
>> > > +  /* If we have gimplified both sides of the initializer but have
>> > > +     not emitted an assignment, do so now.  */
>> > > +  if (*expr_p)
>> > >      {
>> > > +      tree lhs = TREE_OPERAND (*expr_p, 0);
>> > > +      tree rhs = TREE_OPERAND (*expr_p, 1);
>> > > +      gassign *init = gimple_build_assign (lhs, rhs);
>> > > +      gimplify_seq_add_stmt (pre_p, init);
>> > > +    }
>> > > +  if (want_value)
>> > > +    {
>> > >        *expr_p = object;
>> > >        return GS_OK;
>> > >      }
>> > >    else
>> > >      {
>> > > -      /* If we have gimplified both sides of the initializer but have
>> > > -        not emitted an assignment, do so now.  */
>> > > -      if (*expr_p)
>> > > -       {
>> > > -         tree lhs = TREE_OPERAND (*expr_p, 0);
>> > > -         tree rhs = TREE_OPERAND (*expr_p, 1);
>> > > -         gassign *init = gimple_build_assign (lhs, rhs);
>> > > -         gimplify_seq_add_stmt (pre_p, init);
>> > > -         *expr_p = NULL;
>> > > -       }
>> > > -
>> > > +      *expr_p = NULL;
>> > >        return GS_ALL_DONE;
>> > >      }
>> > >  }
>> > > Index: gcc/testsuite/c-c++-common/pr72747-1.c
>> > > ===================================================================
>> > > --- gcc/testsuite/c-c++-common/pr72747-1.c      (revision 0)
>> > > +++ gcc/testsuite/c-c++-common/pr72747-1.c      (working copy)
>> > > @@ -0,0 +1,16 @@
>> > > +/* { dg-do compile } */
>> > > +/* { dg-require-effective-target powerpc_altivec_ok } */
>> > > +/* { dg-options "-maltivec -fdump-tree-gimple" } */
>> > > +
>> > > +/* PR 72747: Test that cascaded definition is happening for constant vectors. */
>> > > +
>> > > +#include <altivec.h>
>> > > +
>> > > +int main (int argc, char *argv[])
>> > > +{
>> > > +       __vector int v1,v2;
>> > > +       v1 = v2 = vec_splats ((int) 42);
>> > > +       return 0;
>> > > +}
>> > > +/* { dg-final { scan-tree-dump-times " v2 = { 42, 42, 42, 42 }" 1 "gimple" } } */
>> > > +
>> > > Index: gcc/testsuite/c-c++-common/pr72747-2.c
>> > > ===================================================================
>> > > --- gcc/testsuite/c-c++-common/pr72747-2.c      (revision 0)
>> > > +++ gcc/testsuite/c-c++-common/pr72747-2.c      (working copy)
>> > > @@ -0,0 +1,18 @@
>> > > +/* { dg-do compile } */
>> > > +/* { dg-require-effective-target powerpc_altivec_ok } */
>> > > +/* { dg-options "-c -maltivec -fdump-tree-gimple" } */
>> > > +
>> > > +/* PR 72747: test that cascaded definition is happening for non constants. */
>> > > +
>> > > +void foo ()
>> > > +{
>> > > +  extern int i;
>> > > +  __vector int v,w;
>> > > +    v = w = (vector int) { i };
>> > > +}
>> > > +
>> > > +int main (int argc, char *argv[])
>> > > +{
>> > > +  return 0;
>> > > +}
>> > > +/* { dg-final { scan-tree-dump-times " w = {i.0_1}" 1 "gimple" } } */
>> > >
>> > >
>> >
>>
>>
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]