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:

$ 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;
  }
}

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;
> +    }
> +}
> 

Reply via email to