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)