summaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorwschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4>2016-08-12 15:23:34 +0000
committerwschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4>2016-08-12 15:23:34 +0000
commit8333fc55aa0dc4783de3d150f0770f70c6bd5baf (patch)
treebf06d0240cfb2afe03fadf214b8cbd141e4c1fb6 /gcc/config
parent56fb8e9de1cba491893b249e5db6bf4d206e8f31 (diff)
downloadgcc-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.c14
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 ();