diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d2ecd0f1d9d..e5f83456f0f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-12-02 Andreas Krebbel + + * gcc/config/s390/s390.c (s390_builtin_vectorization_cost): New + function. + (TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST): Define target + macro. + 2016-12-02 Andreas Krebbel * config/s390/vector.md (vec_halfhalf): New mode iterator. diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index dab4f43e37a..767666e3f7b 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc269ef178f..e39ab1c59a9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-12-02 Andreas Krebbel + + * gcc.target/s390/vector/vec-nopeel-1.c: New test. + 2016-12-02 Andreas Krebbel * gcc.target/s390/zvector/vec-cmp-2.c: New test. diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c b/gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c new file mode 100644 index 00000000000..581c3712772 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c @@ -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" } } */