On Mon, 29 Oct 2018, Martin Liška wrote:

> On 10/29/18 4:02 PM, Richard Biener wrote:
> > On Mon, 29 Oct 2018, Richard Biener wrote:
> > 
> >>
> >> The following fixes gone missing load nodes with the SLP tree build
> >> now eventually caching them but not having them in the SLP tree.
> >>
> >> Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
> > 
> > SPEC testing reveals a thinko...
> 
> If you mean following ICE:
> 
> during GIMPLE pass: slp
> i.c: In function ‘f’:
> i.c:5:6: internal compiler error: in vect_get_place_in_interleaving_chain, at 
> tree-vect-slp.c:212
>     5 | void f() {
>       |      ^
> 0x1579899 vect_get_place_in_interleaving_chain(_stmt_vec_info*, 
> _stmt_vec_info*)
>       /home/marxin/Programming/gcc/gcc/tree-vect-slp.c:212
> 0x157fe0a vect_analyze_slp_instance
>       /home/marxin/Programming/gcc/gcc/tree-vect-slp.c:2020
> 0x1580680 vect_analyze_slp(vec_info*, unsigned int)
>       /home/marxin/Programming/gcc/gcc/tree-vect-slp.c:2158
> 0x15829df vect_slp_analyze_bb_1
>       /home/marxin/Programming/gcc/gcc/tree-vect-slp.c:2861
> 0x1583236 vect_slp_bb(basic_block_def*)
>       /home/marxin/Programming/gcc/gcc/tree-vect-slp.c:2995
> 0x1590031 execute
>       /home/marxin/Programming/gcc/gcc/tree-vectorizer.c:1291
> 
> then the test-case can be simplified into:

Yes.

> $ cat i.c
> int a, b;
> unsigned long c;
> unsigned long *d;
> void e();
> void f() {
>   if (c) {
>     if (a) {
>       e();
>       d[0] = c;
>       d[1] = b;
>     }
>     b = c;
>   }
> }

Thanks,
Richard.

> Martin
> 
> > 
> > Bootstrap & regtest running on x86_64-unknown-linux-gnu.
> > 
> > Richard.
> > 
> > 2018-10-29  Richard Biener  <rguent...@suse.de>
> > 
> >         * tree-vect-slp.c (vect_gather_slp_loads): Only gather
> >         internal defs.
> > 
> >         * gcc.dg/torture/20181029-1.c: New testcase.
> > 
> > Index: gcc/tree-vect-slp.c
> > ===================================================================
> > --- gcc/tree-vect-slp.c     (revision 265593)
> > +++ gcc/tree-vect-slp.c     (working copy)
> > @@ -1645,7 +1645,8 @@ vect_gather_slp_loads (slp_instance inst
> >    if (SLP_TREE_CHILDREN (node).length () == 0)
> >      {
> >        stmt_vec_info stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
> > -      if (STMT_VINFO_GROUPED_ACCESS (stmt_info)
> > +      if (SLP_TREE_DEF_TYPE (node) == vect_internal_def
> > +     && STMT_VINFO_GROUPED_ACCESS (stmt_info)
> >       && DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info)))
> >     SLP_INSTANCE_LOADS (inst).safe_push (node);
> >      }
> > Index: gcc/testsuite/gcc.dg/torture/20181029-1.c
> > ===================================================================
> > --- gcc/testsuite/gcc.dg/torture/20181029-1.c       (nonexistent)
> > +++ gcc/testsuite/gcc.dg/torture/20181029-1.c       (working copy)
> > @@ -0,0 +1,81 @@
> > +/* { dg-do compile } */
> > +
> > +typedef __SIZE_TYPE__ size_t;
> > +typedef unsigned long UV;
> > +typedef size_t STRLEN;
> > +typedef struct sv SV;
> > +typedef struct magic MAGIC;
> > +typedef struct xpv XPV;
> > +typedef unsigned char U8;
> > +typedef int I32;
> > +typedef unsigned int U32;
> > +struct sv {
> > +    void* sv_any;
> > +    U32 sv_flags;
> > +};
> > +struct xpv {
> > +    char * xpv_pv;
> > +    STRLEN xpv_cur;
> > +};
> > +struct magic {
> > +    char* mg_ptr;
> > +};
> > +extern const unsigned char PL_utf8skip[];
> > +char *Perl_sv_2pv_flags (STRLEN *);
> > +void Perl_utf8n_to_uvuni (U8 *);
> > +void Perl_sv_magic (SV *);
> > +void Perl_sv_pos_b2u( register SV* sv, I32* offsetp, MAGIC *mg)
> > +{
> > +  U8* s;
> > +  STRLEN len;
> > +  s = (U8*)(((sv)->sv_flags & (0x00040000)) == 0x00040000
> > +       ? ((len = ((XPV*) (sv)->sv_any)->xpv_cur), ((XPV*) 
> > (sv)->sv_any)->xpv_pv)
> > +       : Perl_sv_2pv_flags(&len));
> > +  if ((I32)len < *offsetp)
> > +    ;
> > +  else
> > +    {
> > +      STRLEN *cache = ((void *)0);
> > +      if (((sv)->sv_flags & (0x00002000|0x00004000|0x00008000))
> > +     && !((sv)->sv_flags & 0x00800000))
> > +   {
> > +     if (mg && mg->mg_ptr)
> > +       {
> > +         cache = (STRLEN *) mg->mg_ptr;
> > +         STRLEN forw = *offsetp;
> > +         STRLEN backw = cache[1] - *offsetp;
> > +         if (!(forw < 2 * backw))
> > +           {
> > +             U8 *p = s + cache[1];
> > +             STRLEN ubackw = 0;
> > +             cache[1] -= backw;
> > +             while (backw--)
> > +               {
> > +                 p--;
> > +                 while ((((U8)*p) >= 0x80 && (((U8)*p) <= 0xbf)))
> > +                   {
> > +                     p--;
> > +                     backw--;
> > +                   }
> > +                 ubackw++;
> > +               }
> > +             cache[0] -= ubackw;
> > +             *offsetp = cache[0];
> > +             cache[2] = 0;
> > +             cache[3] = 0;
> > +             return;
> > +           }
> > +       }
> > +     if (!(((UV)(*s)) < 0x80))
> > +       Perl_utf8n_to_uvuni(s);
> > +   }
> > +      if (!((sv)->sv_flags & 0x00800000))
> > +   {
> > +     if (!mg)
> > +       Perl_sv_magic(sv);
> > +     cache[0] = len;
> > +     cache[1] = *offsetp;
> > +   }
> > +      *offsetp = len;
> > +    }
> > +}
> > 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to