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.
gcc/ChangeLog:
* tree-vect-slp-patterns.c (linear_loads_p): Fix externals.
else if (SLP_TREE_DEF_TYPE (root) != vect_internal_def)
{
retval.first = PERM_TOP;
+ perm_cache->put (root, retval);
return retval;
}
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);
retval.first = kind;
retval.second = nloads;
}
- else if (all_loads.length () == 1)
+ else
{
retval.first = kind;
retval.second = all_loads[0];