diff options
author | wschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-08-12 15:23:34 +0000 |
---|---|---|
committer | wschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-08-12 15:23:34 +0000 |
commit | 8333fc55aa0dc4783de3d150f0770f70c6bd5baf (patch) | |
tree | bf06d0240cfb2afe03fadf214b8cbd141e4c1fb6 /gcc/config | |
parent | 56fb8e9de1cba491893b249e5db6bf4d206e8f31 (diff) | |
download | gcc-8333fc55aa0dc4783de3d150f0770f70c6bd5baf.tar.gz |
2016-08-12 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* 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
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 14 |
1 files changed, 9 insertions, 5 deletions
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 (); |