tree-optimization/98855 - fix some vectorizer cost issues
authorRichard Biener <rguenther@suse.de>
Thu, 4 Feb 2021 11:08:47 +0000 (12:08 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 4 Feb 2021 12:02:09 +0000 (13:02 +0100)
This fixes us not costing vectorized bswap for SLP as well as
avoiding biasing to the vectorized side when costing single-argument
PHIs.  Instead we assume coalescing here and cost them with zero cost
for both the scalar and vectorized code.

This doesn't fix the PR on its own.

2021-02-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/98855
* tree-vect-loop.c (vectorizable_phi): Do not cost
single-argument PHIs.
* tree-vect-slp.c (vect_bb_slp_scalar_cost): Likewise.
* tree-vect-stmts.c (vectorizable_bswap): Also perform
costing for SLP operation.

gcc/tree-vect-loop.c
gcc/tree-vect-slp.c
gcc/tree-vect-stmts.c

index 200ed27b32ef4aa54c6783afa1864924b6f55582..f1f16e3b1b96eecc85bd94ab6ada1ff9e057ba1b 100644 (file)
@@ -7777,8 +7777,12 @@ vectorizable_phi (vec_info *,
                               "incompatible vector types for invariants\n");
            return false;
          }
-      record_stmt_cost (cost_vec, SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
-                       vector_stmt, stmt_info, vectype, 0, vect_body);
+      /* For single-argument PHIs assume coalescing which means zero cost
+        for the scalar and the vector PHIs.  This avoids artificially
+        favoring the vector path (but may pessimize it in some cases).  */
+      if (gimple_phi_num_args (as_a <gphi *> (stmt_info->stmt)) > 1)
+       record_stmt_cost (cost_vec, SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
+                         vector_stmt, stmt_info, vectype, 0, vect_body);
       STMT_VINFO_TYPE (stmt_info) = phi_info_type;
       return true;
     }
index 10b876ff5ede8896eb95abd22f716e458c99416d..2305bbdec3ae8d69dea906c8b1f23e18620ac263 100644 (file)
@@ -4297,6 +4297,13 @@ vect_bb_slp_scalar_cost (vec_info *vinfo,
        }
       else if (vect_nop_conversion_p (orig_stmt_info))
        continue;
+      /* For single-argument PHIs assume coalescing which means zero cost
+        for the scalar and the vector PHIs.  This avoids artificially
+        favoring the vector path (but may pessimize it in some cases).  */
+      else if (is_a <gphi *> (orig_stmt_info->stmt)
+              && gimple_phi_num_args
+                   (as_a <gphi *> (orig_stmt_info->stmt)) == 1)
+       continue;
       else
        kind = scalar_stmt;
       record_stmt_cost (cost_vec, 1, kind, orig_stmt_info,
index 5eb7b2d1d6e14151031b126dae82b27503443f8f..0bc1cb1c5b4f6c1f0447241b4d31434bf7cca1a4 100644 (file)
@@ -3002,13 +3002,12 @@ vectorizable_bswap (vec_info *vinfo,
 
       STMT_VINFO_TYPE (stmt_info) = call_vec_info_type;
       DUMP_VECT_SCOPE ("vectorizable_bswap");
-      if (! slp_node)
-       {
-         record_stmt_cost (cost_vec,
-                           1, vector_stmt, stmt_info, 0, vect_prologue);
-         record_stmt_cost (cost_vec,
-                           ncopies, vec_perm, stmt_info, 0, vect_body);
-       }
+      record_stmt_cost (cost_vec,
+                       1, vector_stmt, stmt_info, 0, vect_prologue);
+      record_stmt_cost (cost_vec,
+                       slp_node
+                       ? SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) : ncopies,
+                       vec_perm, stmt_info, 0, vect_body);
       return true;
     }