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