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];
>
>
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)