--- /dev/null
+#ifndef TYPE
+#define TYPE short
+#define MAX 16
+#define IV_TYPE char
+#endif
+
+#include "tree-vect.h"
+
+__attribute__((noipa))
+void f(TYPE* acc)
+{
+ for (IV_TYPE row = 0; row < MAX; ++row)
+ acc[row] = acc[row] << row;
+}
+
+__attribute__((noipa))
+void g(TYPE* acc)
+{
+#pragma GCC novector
+ for (IV_TYPE row = 0; row < MAX; ++row)
+ acc[row] = acc[row] << row;
+}
+
+int main ()
+{
+
+ check_vect ();
+
+ TYPE acc1[MAX] = {};
+ TYPE acc2[MAX] = {};
+#pragma GCC novector
+ for (int i = 0; i < MAX; i++)
+ acc1[i] = acc2[i] = i;
+
+ f (acc1);
+ f (acc2);
+
+#pragma GCC novector
+ for (int i = 0; i < MAX; i++)
+ if (acc1[i] != acc2[i])
+ __builtin_abort ();
+}
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { vect_var_shift && vect_int } } } } */
+/* { dg-final { scan-tree-dump "vect_recog_over_widening_pattern: detected" "vect" { target { vect_var_shift && vect_int } } } } */
--- /dev/null
+#ifndef TYPE
+#define TYPE int
+#define MAX 32
+#define IV_TYPE short
+#endif
+
+#include "tree-vect.h"
+
+__attribute__((noipa))
+void f(TYPE* acc)
+{
+ for (IV_TYPE row = 0; row < MAX; ++row)
+ acc[row] = acc[row] << row;
+}
+
+__attribute__((noipa))
+void g(TYPE* acc)
+{
+#pragma GCC novector
+ for (IV_TYPE row = 0; row < MAX; ++row)
+ acc[row] = acc[row] << row;
+}
+
+int main ()
+{
+
+ check_vect ();
+
+ TYPE acc1[MAX] = {};
+ TYPE acc2[MAX] = {};
+#pragma GCC novector
+ for (int i = 0; i < MAX; i++)
+ acc1[i] = acc2[i] = i;
+
+ f (acc1);
+ f (acc2);
+
+#pragma GCC novector
+ for (int i = 0; i < MAX; i++)
+ if (acc1[i] != acc2[i])
+ __builtin_abort ();
+}
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { vect_var_shift && vect_int } } } } */
+/* { dg-final { scan-tree-dump-not "vect_recog_over_widening_pattern: detected" "vect" { target { vect_var_shift && vect_int } } } } */
--- /dev/null
+#ifndef TYPE
+#define TYPE long long
+#define MAX 64
+#define IV_TYPE int
+#endif
+
+#include "tree-vect.h"
+
+__attribute__((noipa))
+void f(TYPE* acc)
+{
+ for (IV_TYPE row = 0; row < MAX; ++row)
+ acc[row] = acc[row] << row;
+}
+
+__attribute__((noipa))
+void g(TYPE* acc)
+{
+#pragma GCC novector
+ for (IV_TYPE row = 0; row < MAX; ++row)
+ acc[row] = acc[row] << row;
+}
+
+int main ()
+{
+
+ check_vect ();
+
+ TYPE acc1[MAX] = {};
+ TYPE acc2[MAX] = {};
+#pragma GCC novector
+ for (int i = 0; i < MAX; i++)
+ acc1[i] = acc2[i] = i;
+
+ f (acc1);
+ f (acc2);
+
+#pragma GCC novector
+ for (int i = 0; i < MAX; i++)
+ if (acc1[i] != acc2[i])
+ __builtin_abort ();
+}
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { vect_var_shift && vect_int } } } } */
+/* { dg-final { scan-tree-dump "vect_recog_vector_vector_shift_pattern: detected" "vect" { target { vect_var_shift && vect_int } } } } */
!= TYPE_PRECISION (TREE_TYPE (oprnd0)))
return NULL;
- stmt_vec_info def_vinfo = vect_get_internal_def (vinfo, oprnd1);
- if (!def_vinfo)
+ stmt_vec_info def_vinfo = vinfo->lookup_def (oprnd1);
+ if (!def_vinfo || STMT_VINFO_DEF_TYPE (def_vinfo) == vect_external_def)
return NULL;
+ def_vinfo = vect_stmt_to_vectorize (def_vinfo);
+ gcc_assert (def_vinfo);
+
*type_out = get_vectype_for_scalar_type (vinfo, TREE_TYPE (oprnd0));
if (*type_out == NULL_TREE)
return NULL;