This avoids using get_same_sized_vectype in vectorizable_induction
where we only want a signed/unsigned variant of vectype.  This
avoids the oddball scalar boolean type handling in that function.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR tree-optimization/127475
        * tree-vect-loop.cc (vectorizable_induction): Use
        signed_or_unsigned_type_for to get the step vectype.

        * gcc.dg/vect/vect-pr127475.c: New testcase.
---
 gcc/testsuite/gcc.dg/vect/vect-pr127475.c | 40 +++++++++++++++++++++++
 gcc/tree-vect-loop.cc                     |  4 ++-
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/vect-pr127475.c

diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr127475.c 
b/gcc/testsuite/gcc.dg/vect/vect-pr127475.c
new file mode 100644
index 00000000000..5d7aef1b5af
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-pr127475.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fgimple" } */
+
+typedef _Bool bool8 __attribute__((signed_bool_precision(8)));
+
+void __GIMPLE (ssa)
+f (unsigned char * restrict a, int n)
+{
+  int i;
+  bool8 j;
+  unsigned char _31;
+  unsigned long _32;
+  unsigned char * _33;
+
+  __BB(2):
+  if (n_2(D) > 0)
+    goto __BB3;
+  else
+    goto __BB5;
+
+  __BB(3):
+  i_10 = __PHI (__BB2: 0, __BB4: i_11);
+  j_20 = __PHI (__BB2: _Literal (bool8) 0, __BB4: j_21);
+  _31 = (unsigned char) j_20;
+  _32 = (unsigned long) i_10;
+  _33 = a_1(D) + _32;
+  __MEM <unsigned char> (_33) = _31;
+  j_21 = j_20 + _Literal (bool8) 1;
+  i_11 = i_10 + 1;
+  if (i_11 < n_2(D))
+    goto __BB4;
+  else
+    goto __BB5;
+
+  __BB(4):
+  goto __BB3;
+
+  __BB(5):
+  return;
+}
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 4a049238142..5169b60025e 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -9650,7 +9650,9 @@ vectorizable_induction (loop_vec_info loop_vinfo,
       return false;
     }
   tree stept = TREE_TYPE (step_expr);
-  tree step_vectype = get_same_sized_vectype (stept, vectype);
+  tree step_vectype
+    = (!INTEGRAL_TYPE_P (stept) ? vectype
+       : signed_or_unsigned_type_for (TYPE_UNSIGNED (stept), vectype));
   stept = TREE_TYPE (step_vectype);
 
   /* Check for target support of the vectorized arithmetic used here.  */
-- 
2.51.0

Reply via email to