Fix vectorizable_live_operation handling of vector booleans
authorRichard Sandiford <richard.sandiford@linaro.org>
Mon, 18 Sep 2017 15:26:03 +0000 (15:26 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 18 Sep 2017 15:26:03 +0000 (15:26 +0000)
vectorizable_live_operation needs to use BIT_FIELD_REF to extract one
element of a vector.  For a packed vector boolean type, the number of
bits to extract should be taken from TYPE_PRECISION rather than TYPE_SIZE.

This is shown by existing tests once SVE is added.

2017-09-18  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* tree-vect-loop.c (vectorizable_live_operation): Fix element size
calculation for vector booleans.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r252930

gcc/ChangeLog
gcc/tree-vect-loop.c

index 9292748cb1ac0d7669b313e30746377858611630..4c052cc55bc0b4d594c55f9d4fb2664ceb0f60c3 100644 (file)
@@ -1,3 +1,10 @@
+2017-09-18  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * tree-vect-loop.c (vectorizable_live_operation): Fix element size
+       calculation for vector booleans.
+
 2017-09-18  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 82b6629e12839a4813a593daecc9758e5648dea9..5d29ef5275cdde4adb6f6d10bfe427daaba0f04a 100644 (file)
@@ -7066,7 +7066,9 @@ vectorizable_live_operation (gimple *stmt,
        : gimple_get_lhs (stmt);
   lhs_type = TREE_TYPE (lhs);
 
-  bitsize = TYPE_SIZE (TREE_TYPE (vectype));
+  bitsize = (VECTOR_BOOLEAN_TYPE_P (vectype)
+            ? bitsize_int (TYPE_PRECISION (TREE_TYPE (vectype)))
+            : TYPE_SIZE (TREE_TYPE (vectype)));
   vec_bitsize = TYPE_SIZE (vectype);
 
   /* Get the vectorized lhs of STMT and the lane to use (counted in bits).  */