rs6000.c (rs6000_builtin_vectorization_cost): Correct costs for vec_construct.
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Fri, 12 Aug 2016 15:23:34 +0000 (15:23 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Fri, 12 Aug 2016 15:23:34 +0000 (15:23 +0000)
2016-08-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost):
Correct costs for vec_construct.

From-SVN: r239417

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index e0dab59f4c5cf06f4f1c06ce77b28256bcad19d9..49f0b6d073c1c6f21cf72b0ca406cc80edbde2c6 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost):
+       Correct costs for vec_construct.
+
 2016-08-12  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/69848
index 756e69df3c599620e56aa8edfc653126bc857a23..e58ede1e9f278392c6110b7a20823ad36e5f8c57 100644 (file)
@@ -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 ();