From 8333fc55aa0dc4783de3d150f0770f70c6bd5baf Mon Sep 17 00:00:00 2001 From: wschmidt Date: Fri, 12 Aug 2016 15:23:34 +0000 Subject: 2016-08-12 Bill Schmidt * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): Correct costs for vec_construct. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239417 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/rs6000/rs6000.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'gcc/config') diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 756e69df3c5..e58ede1e9f2 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5266,16 +5266,20 @@ rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, return 2; case vec_construct: - elements = TYPE_VECTOR_SUBPARTS (vectype); + /* This is a rough approximation assuming non-constant elements + constructed into a vector via element insertion. FIXME: + vec_construct is not granular enough for uniformly good + decisions. If the initialization is a splat, this is + cheaper than we estimate. Improve this someday. */ elem_type = TREE_TYPE (vectype); /* 32-bit vectors loaded into registers are stored as double - precision, so we need n/2 converts in addition to the usual - n/2 merges to construct a vector of short floats from them. */ + precision, so we need 2 permutes, 2 converts, and 1 merge + to construct a vector of short floats from them. */ if (SCALAR_FLOAT_TYPE_P (elem_type) && TYPE_PRECISION (elem_type) == 32) - return elements + 1; + return 5; else - return elements / 2 + 1; + return max (2, TYPE_VECTOR_SUBPARTS (vectype) - 1); default: gcc_unreachable (); -- cgit v1.2.1