diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d228f00b109..e039d3bd1a0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2017-09-10 Bill Schmidt + + Backport from mainline + 2017-05-11 Bill Schmidt + + PR target/80695 + * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): + Account for direct move costs for vec_construct of integer + vectors. + + Backport from mainline + 2017-07-23 Bill Schmidt + + PR target/80695 + * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): + Reduce cost estimate for direct moves. + 2017-09-08 Eric Botcazou PR target/81988 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index b5b83f2d89e..a7ec6846b70 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5766,8 +5766,20 @@ rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, if (SCALAR_FLOAT_TYPE_P (elem_type) && TYPE_PRECISION (elem_type) == 32) return 5; + /* On POWER9, integer vector types are built up in GPRs and then + use a direct move (2 cycles). For POWER8 this is even worse, + as we need two direct moves and a merge, and the direct moves + are five cycles. */ + else if (INTEGRAL_TYPE_P (elem_type)) + { + if (TARGET_P9_VECTOR) + return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 2; + else + return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 5; + } else - return max (2, TYPE_VECTOR_SUBPARTS (vectype) - 1); + /* V2DFmode doesn't need a direct move. */ + return 2; default: gcc_unreachable (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7690c1f29c2..acb91384807 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2017-09-10 Bill Schmidt + + Backport from mainline + 2017-05-11 Bill Schmidt + + PR target/80695 + * gcc.target/powerpc/pr80695-p8.c: New file. + * gcc.target/powerpc/pr80695-p9.c: New file. + 2017-09-10 Eric Botcazou PR ada/79441 diff --git a/gcc/testsuite/gcc.target/powerpc/pr80695-p8.c b/gcc/testsuite/gcc.target/powerpc/pr80695-p8.c new file mode 100644 index 00000000000..165079a3a6c --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr80695-p8.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-require-effective-target vect_int } */ +/* { dg-options "-mcpu=power8 -O3 -fdump-tree-slp-details" } */ + +/* PR80695: Verify cost model for vec_construct on POWER8. */ + +long a[10] __attribute__((aligned(16))); + +void foo (long i, long j, long k, long l) +{ + a[6] = i; + a[7] = j; + a[8] = k; + a[9] = l; +} + +/* { dg-final { scan-tree-dump-times "vectorization is not profitable" 1 "slp2" } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr80695-p9.c b/gcc/testsuite/gcc.target/powerpc/pr80695-p9.c new file mode 100644 index 00000000000..a81f90ac3c4 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr80695-p9.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target vect_int } */ +/* { dg-options "-mcpu=power9 -O3 -fdump-tree-slp-details" } */ + +/* PR80695: Verify cost model for vec_construct on POWER9. */ + +long a[10] __attribute__((aligned(16))); + +void foo (long i, long j, long k, long l) +{ + a[6] = i; + a[7] = j; + a[8] = k; + a[9] = l; +} + +/* { dg-final { scan-tree-dump-times "vectorization is not profitable" 1 "slp2" } } */