Handle SLP_TREE_LANE_PERMUTATION in scalar costing
authorRichard Biener <rguenther@suse.de>
Mon, 20 Apr 2020 08:05:06 +0000 (10:05 +0200)
committerRichard Biener <rguenther@suse.de>
Fri, 19 Jun 2020 14:43:36 +0000 (16:43 +0200)
This properly handles a lane permutation in scalar costing.
For the current only use this doesn't matter much but with
permutes that change the number of lanes it will eventually
ICE.

2020-06-19  Richard Biener  <rguenther@suse.de>

* tree-vect-slp.c (vect_bb_slp_scalar_cost): Adjust
for lane permutations.

gcc/tree-vect-slp.c

index 84b97270cd190d93c84f1ef11d0cf04304389fdd..5c169f37022b27c462a4f39f47eed11f30e5ad19 100644 (file)
@@ -2969,7 +2969,22 @@ vect_bb_slp_scalar_cost (vec_info *vinfo,
        {
          /* Do not directly pass LIFE to the recursive call, copy it to
             confine changes in the callee to the current child/subtree.  */
-         subtree_life.safe_splice (*life);
+         if (SLP_TREE_CODE (node) == VEC_PERM_EXPR)
+           {
+             subtree_life.safe_grow_cleared (SLP_TREE_LANES (child));
+             for (unsigned j = 0;
+                  j < SLP_TREE_LANE_PERMUTATION (node).length (); ++j)
+               {
+                 auto perm = SLP_TREE_LANE_PERMUTATION (node)[j];
+                 if (perm.first == i)
+                   subtree_life[perm.second] = (*life)[j];
+               }
+           }
+         else
+           {
+             gcc_assert (SLP_TREE_LANES (node) == SLP_TREE_LANES (child));
+             subtree_life.safe_splice (*life);
+           }
          vect_bb_slp_scalar_cost (vinfo, child, &subtree_life, cost_vec,
                                   visited);
          subtree_life.truncate (0);