Message ID | 20201228133639.GA22403@arm.com |
---|---|
State | New |
Headers | show |
Series | [1/8,v9] middle-end slp: Support optimizing load distribution | expand |
On Mon, 28 Dec 2020, Tamar Christina wrote: > Hi All, > > This fixes a bug with externals and linear_loads_p where I forgot to save the > value before returning. > > It also fixes handling of nodes with multiple children on a non VEC_PERM node. > There the child iteration would already resolve the kind and the loads are All > expected to be the same if valid so just return one. > > Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu > and no issues. > > Ok for master? OK. Richard. > Thanks, > Tamar > > gcc/ChangeLog: > > * tree-vect-slp-patterns.c (linear_loads_p): Fix externals. > > --- inline copy of patch -- > diff --git a/gcc/tree-vect-slp-patterns.c b/gcc/tree-vect-slp-patterns.c > index 7fd79d91c6ba4ccdbf361307a6105fb7e46aa961..235c0741c78b04f14725751ec399c0fdb32a0823 100644 > --- a/gcc/tree-vect-slp-patterns.c > +++ b/gcc/tree-vect-slp-patterns.c > @@ -229,6 +229,7 @@ linear_loads_p (slp_tree_to_load_perm_map_t *perm_cache, slp_tree root) > else if (SLP_TREE_DEF_TYPE (root) != vect_internal_def) > { > retval.first = PERM_TOP; > + perm_cache->put (root, retval); > return retval; > } > > @@ -241,6 +242,7 @@ linear_loads_p (slp_tree_to_load_perm_map_t *perm_cache, slp_tree root) > complex_load_perm_t res = linear_loads_p (perm_cache, child); > kind = vect_merge_perms (kind, res.first); > /* Unknown and Top are not valid on blends as they produce no permute. */ > + retval.first = kind; > if (kind == PERM_UNKNOWN || kind == PERM_TOP) > return retval; > all_loads.safe_push (res.second); > @@ -258,7 +260,7 @@ linear_loads_p (slp_tree_to_load_perm_map_t *perm_cache, slp_tree root) > retval.first = kind; > retval.second = nloads; > } > - else if (all_loads.length () == 1) > + else > { > retval.first = kind; > retval.second = all_loads[0]; > > >
diff --git a/gcc/tree-vect-slp-patterns.c b/gcc/tree-vect-slp-patterns.c index 7fd79d91c6ba4ccdbf361307a6105fb7e46aa961..235c0741c78b04f14725751ec399c0fdb32a0823 100644 --- a/gcc/tree-vect-slp-patterns.c +++ b/gcc/tree-vect-slp-patterns.c @@ -229,6 +229,7 @@ linear_loads_p (slp_tree_to_load_perm_map_t *perm_cache, slp_tree root) else if (SLP_TREE_DEF_TYPE (root) != vect_internal_def) { retval.first = PERM_TOP; + perm_cache->put (root, retval); return retval; } @@ -241,6 +242,7 @@ linear_loads_p (slp_tree_to_load_perm_map_t *perm_cache, slp_tree root) complex_load_perm_t res = linear_loads_p (perm_cache, child); kind = vect_merge_perms (kind, res.first); /* Unknown and Top are not valid on blends as they produce no permute. */ + retval.first = kind; if (kind == PERM_UNKNOWN || kind == PERM_TOP) return retval; all_loads.safe_push (res.second); @@ -258,7 +260,7 @@ linear_loads_p (slp_tree_to_load_perm_map_t *perm_cache, slp_tree root) retval.first = kind; retval.second = nloads; } - else if (all_loads.length () == 1) + else { retval.first = kind; retval.second = all_loads[0];