S/390: Define vectorization_cost hook
Define the vectorization_cost hook. The only change right now compared to the default implementation is the reduced costs for unaligned loads/stores. This is supposed to prevent unnecessary loop peeling performed to reach better alignments. Further tuning of this hook is required. -Andreas- gcc/ChangeLog: 2016-12-02 Andreas Krebbel <krebbel@linux.vnet.ibm.com> * gcc/config/s390/s390.c (s390_builtin_vectorization_cost): New function. (TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST): Define target macro. gcc/testsuite/ChangeLog: 2016-12-02 Andreas Krebbel <krebbel@linux.vnet.ibm.com> * gcc.target/s390/vector/vec-nopeel-1.c: New test. From-SVN: r243158
This commit is contained in:
parent
9ad49cdb53
commit
7f5fc63362
@ -1,3 +1,10 @@
|
||||
2016-12-02 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* gcc/config/s390/s390.c (s390_builtin_vectorization_cost): New
|
||||
function.
|
||||
(TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST): Define target
|
||||
macro.
|
||||
|
||||
2016-12-02 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* config/s390/vector.md (vec_halfhalf): New mode iterator.
|
||||
|
@ -3674,6 +3674,40 @@ s390_address_cost (rtx addr, machine_mode mode ATTRIBUTE_UNUSED,
|
||||
return ad.indx? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
|
||||
}
|
||||
|
||||
/* Implement targetm.vectorize.builtin_vectorization_cost. */
|
||||
static int
|
||||
s390_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
|
||||
tree vectype,
|
||||
int misalign ATTRIBUTE_UNUSED)
|
||||
{
|
||||
switch (type_of_cost)
|
||||
{
|
||||
case scalar_stmt:
|
||||
case scalar_load:
|
||||
case scalar_store:
|
||||
case vector_stmt:
|
||||
case vector_load:
|
||||
case vector_store:
|
||||
case vec_to_scalar:
|
||||
case scalar_to_vec:
|
||||
case cond_branch_not_taken:
|
||||
case vec_perm:
|
||||
case vec_promote_demote:
|
||||
case unaligned_load:
|
||||
case unaligned_store:
|
||||
return 1;
|
||||
|
||||
case cond_branch_taken:
|
||||
return 3;
|
||||
|
||||
case vec_construct:
|
||||
return TYPE_VECTOR_SUBPARTS (vectype) - 1;
|
||||
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
}
|
||||
|
||||
/* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
|
||||
otherwise return 0. */
|
||||
|
||||
@ -15428,6 +15462,9 @@ s390_excess_precision (enum excess_precision_type type)
|
||||
#define TARGET_REGISTER_MOVE_COST s390_register_move_cost
|
||||
#undef TARGET_MEMORY_MOVE_COST
|
||||
#define TARGET_MEMORY_MOVE_COST s390_memory_move_cost
|
||||
#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
|
||||
#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
|
||||
s390_builtin_vectorization_cost
|
||||
|
||||
#undef TARGET_MACHINE_DEPENDENT_REORG
|
||||
#define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
|
||||
|
@ -1,3 +1,7 @@
|
||||
2016-12-02 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/s390/vector/vec-nopeel-1.c: New test.
|
||||
|
||||
2016-12-02 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/s390/zvector/vec-cmp-2.c: New test.
|
||||
|
17
gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
Normal file
17
gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O3 -mzarch -march=z13" } */
|
||||
/* { dg-require-effective-target vector } */
|
||||
|
||||
int
|
||||
foo (int * restrict a, int n)
|
||||
{
|
||||
int i, result = 0;
|
||||
|
||||
for (i = 0; i < n * 4; i++)
|
||||
result += a[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
/* We do NOT want this loop to get peeled. Without peeling no scalar
|
||||
memory add should appear. */
|
||||
/* { dg-final { scan-assembler-not "\ta\t" } } */
|
Loading…
Reference in New Issue
Block a user