]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Generic vector op costing adjustment
authorRichard Biener <rguenther@suse.de>
Tue, 23 May 2023 13:58:52 +0000 (15:58 +0200)
committerRichard Biener <rguenther@suse.de>
Tue, 23 May 2023 15:57:33 +0000 (17:57 +0200)
This is a small adjustment to the work done for PR108752 and
better reflects the cost of the generated sequence.

PR tree-optimization/108752
* tree-vect-stmts.cc (vectorizable_operation): For bit
operations with generic word_mode vectors do not cost
an extra stmt.  For plus, minus and negate also cost the
constant materialization.

gcc/tree-vect-stmts.cc

index 0022b878767d8e115647b0614b058abffcb31ed5..127b987cd624dc0ce8459071fe72a6ed5a24866b 100644 (file)
@@ -6466,8 +6466,8 @@ vectorizable_operation (vec_info *vinfo,
        {
          /* The above vect_model_simple_cost call handles constants
             in the prologue and (mis-)costs one of the stmts as
-            vector stmt.  See tree-vect-generic.cc:do_plus_minus/do_negate
-            for the actual lowering that will be applied.  */
+            vector stmt.  See below for the actual lowering that will
+            be applied.  */
          unsigned n
            = slp_node ? SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) : ncopies;
          switch (code)
@@ -6481,9 +6481,20 @@ vectorizable_operation (vec_info *vinfo,
            case NEGATE_EXPR:
              n *= 4;
              break;
-           default:;
+           default:
+             /* Bit operations do not have extra cost and are accounted
+                as vector stmt by vect_model_simple_cost.  */
+             n = 0;
+             break;
+           }
+         if (n != 0)
+           {
+             /* We also need to materialize two large constants.  */
+             record_stmt_cost (cost_vec, 2, scalar_stmt, stmt_info,
+                               0, vect_prologue);
+             record_stmt_cost (cost_vec, n, scalar_stmt, stmt_info,
+                               0, vect_body);
            }
-         record_stmt_cost (cost_vec, n, scalar_stmt, stmt_info, 0, vect_body);
        }
       return true;
     }