slp: handle externals correctly in linear_loads_p
authorTamar Christina <tamar.christina@arm.com>
Mon, 11 Jan 2021 09:57:41 +0000 (09:57 +0000)
committerTamar Christina <tamar.christina@arm.com>
Mon, 11 Jan 2021 09:57:41 +0000 (09:57 +0000)
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.

gcc/tree-vect-slp-patterns.c

index e30cea110f6bf5838d9c721f7e614153d32b8dbf..4bead9a0b477f3b24a38ea2630e962c28c687e10 100644 (file)
@@ -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];