The 06/25/2024 17:10, Jason Merrill wrote:
> On 6/25/24 04:01, Tamar Christina wrote:
> > Hi All,
> > 
> > It looks like I forgot to check in the C++ frontend if a condition exist 
> > for the
> > loop being adorned with novector.  This causes a segfault because cond isn't
> > expected to be null.
> > 
> > This fixes it by issuing the same kind of diagnostics we issue for the other
> > pragmas.
> > 
> > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
> > 
> > Ok for master? and backport to GCC-14?
> 
> Hmm, I'm not sure we want to error in this case; it's pointless, but 
> indeed we aren't going to vectorize a loop that always loops.  I'd think 
> we should treat it the same as an explicit "true" condition.  And 
> perhaps the same for unroll/ivdep.
> 
> Does the C front-end treat the null condition different from a constant 
> true condition?
> 

No, in the C front-end we error for ivdep and unroll, but for novector we 
explicitly
suppress it by checking for novector && cond && cond != error_mark_node instead 
of
just novector && cond != error_mark_node in the use site.

Do you want to handle it that way to be consistent?

Cheers,
Tamar
> > Thanks,
> > Tamar
> > 
> > gcc/cp/ChangeLog:
> > 
> >     PR c++/115623
> >     * parser.cc (cp_parser_c_for): Add check for C++ cond.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     PR c++/115623
> >     * g++.dg/vect/vect-novector-pragma_2.cc: New test.
> > 
> > ---
> > diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> > index 
> > e7409b856f1127e303c6515a3bb2d61a10e7c378..24d7b0e4992fdff69951ac5955f304e473f53374
> >  100644
> > --- a/gcc/cp/parser.cc
> > +++ b/gcc/cp/parser.cc
> > @@ -14107,6 +14107,12 @@ cp_parser_c_for (cp_parser *parser, tree scope, 
> > tree init, bool ivdep,
> >                    "%<GCC unroll%> pragma");
> >         condition = error_mark_node;
> >       }
> > +  else if (novector)
> > +    {
> > +      cp_parser_error (parser, "missing loop condition in loop with "
> > +                  "%<GCC novector%> pragma");
> > +      condition = error_mark_node;
> > +    }
> >     finish_for_cond (condition, stmt, ivdep, unroll, novector);
> >     /* Look for the `;'.  */
> >     cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
> > diff --git a/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc 
> > b/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc
> > new file mode 100644
> > index 
> > 0000000000000000000000000000000000000000..05dba4db1c6544bc53cd05482d1b2e767052cf43
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc
> > @@ -0,0 +1,10 @@
> > +/* { dg-do compile } */
> > +
> > +void f (char *a, int i)
> > +{
> > +#pragma GCC novector
> > +  for (;;i++)
> > +    a[i] *= 2;
> > +}
> > +
> > +/* { dg-error "missing loop condition in loop with 'GCC novector' pragma 
> > before ';' token" "" { target *-*-* } 6 } */
> > 
> > 
> > 
> > 
> 

-- 

Reply via email to