rs6000: Guard density_test only for vector version
This patch teaches rs6000_density_test to only care about the vector version cost calculation and early return when calculating the single scalar iteration cost. Bootstrapped/regtested on powerpc64le-linux-gnu P9. gcc/ChangeLog: * config/rs6000/rs6000.c (struct rs6000_cost_data): New member costing_for_scalar. (rs6000_density_test): Early return if costing_for_scalar is true. (rs6000_init_cost): Init costing_for_scalar of rs6000_cost_data.
This commit is contained in:
parent
096f8215d2
commit
1866182f6c
1 changed files with 10 additions and 1 deletions
|
@ -5238,6 +5238,8 @@ typedef struct _rs6000_cost_data
|
|||
/* For each vectorized loop, this var holds TRUE iff a non-memory vector
|
||||
instruction is needed by the vectorization. */
|
||||
bool vect_nonmem;
|
||||
/* Indicates this is costing for the scalar version of a loop or block. */
|
||||
bool costing_for_scalar;
|
||||
} rs6000_cost_data;
|
||||
|
||||
/* Test for likely overcommitment of vector hardware resources. If a
|
||||
|
@ -5259,6 +5261,12 @@ rs6000_density_test (rs6000_cost_data *data)
|
|||
int vec_cost = data->cost[vect_body], not_vec_cost = 0;
|
||||
int i, density_pct;
|
||||
|
||||
/* This density test only cares about the cost of vector version of the
|
||||
loop, so immediately return if we are passed costing for the scalar
|
||||
version (namely computing single scalar iteration cost). */
|
||||
if (data->costing_for_scalar)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nbbs; i++)
|
||||
{
|
||||
basic_block bb = bbs[i];
|
||||
|
@ -5296,7 +5304,7 @@ rs6000_density_test (rs6000_cost_data *data)
|
|||
/* Implement targetm.vectorize.init_cost. */
|
||||
|
||||
static void *
|
||||
rs6000_init_cost (struct loop *loop_info, bool)
|
||||
rs6000_init_cost (struct loop *loop_info, bool costing_for_scalar)
|
||||
{
|
||||
rs6000_cost_data *data = XNEW (struct _rs6000_cost_data);
|
||||
data->loop_info = loop_info;
|
||||
|
@ -5304,6 +5312,7 @@ rs6000_init_cost (struct loop *loop_info, bool)
|
|||
data->cost[vect_body] = 0;
|
||||
data->cost[vect_epilogue] = 0;
|
||||
data->vect_nonmem = false;
|
||||
data->costing_for_scalar = costing_for_scalar;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue