--- /dev/null
+/* PR target/70021 */
+/* { dg-do run } */
+
+#include "tree-vect.h"
+
+#define N 160
+int a[N];
+unsigned long long int b[N], c[N], d[N], e[N];
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+ int i;
+ for (i = 0; i < N; i += 4)
+ {
+ unsigned long long int f = (_Bool) b[i];
+ unsigned long long int g = c[i] != d[i];
+ e[i] = g ^ (a[i] & (g << f));
+ }
+}
+
+int
+main ()
+{
+ int i;
+ check_vect ();
+ for (i = 0; i < N; ++i)
+ {
+ a[i] = 1618000128;
+ b[i] = 10919594786573202791ULL;
+ c[i] = 2593730175074624973ULL;
+ d[i] = 7447894520878803661ULL;
+ e[i] = 14234165565810642243ULL;
+ }
+ foo ();
+ for (i = 0; i < N; ++i)
+ if (e[i] != ((i & 3) ? 14234165565810642243ULL : 1ULL))
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* PR target/70021 */
+/* { dg-do run } */
+/* { dg-require-effective-target avx2 } */
+/* { dg-options "-O2 -ftree-vectorize -mavx2 -fdump-tree-vect-details" } */
+
+#include "avx2-check.h"
+
+#define N 160
+int a[N];
+unsigned long long int b[N], c[N], d[N], e[N];
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+ int i;
+ for (i = 0; i < N; i += 4)
+ {
+ unsigned long long int f = (_Bool) b[i];
+ unsigned long long int g = c[i] != d[i];
+ e[i] = g ^ (a[i] & (g << f));
+ }
+}
+
+void
+avx2_test ()
+{
+ int i;
+ for (i = 0; i < N; ++i)
+ {
+ a[i] = 1618000128;
+ b[i] = 10919594786573202791ULL;
+ c[i] = 2593730175074624973ULL;
+ d[i] = 7447894520878803661ULL;
+ e[i] = 14234165565810642243ULL;
+ }
+ foo ();
+ for (i = 0; i < N; ++i)
+ if (e[i] != ((i & 3) ? 14234165565810642243ULL : 1ULL))
+ __builtin_abort ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */
static void
vect_mark_relevant (vec<gimple *> *worklist, gimple *stmt,
- enum vect_relevant relevant, bool live_p,
- bool used_in_pattern)
+ enum vect_relevant relevant, bool live_p)
{
stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
enum vect_relevant save_relevant = STMT_VINFO_RELEVANT (stmt_info);
stmt itself should be marked. */
if (STMT_VINFO_IN_PATTERN_P (stmt_info))
{
- bool found = false;
- if (!used_in_pattern)
- {
- imm_use_iterator imm_iter;
- use_operand_p use_p;
- gimple *use_stmt;
- tree lhs;
- loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
- struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
-
- if (is_gimple_assign (stmt))
- lhs = gimple_assign_lhs (stmt);
- else
- lhs = gimple_call_lhs (stmt);
-
- /* This use is out of pattern use, if LHS has other uses that are
- pattern uses, we should mark the stmt itself, and not the pattern
- stmt. */
- if (lhs && TREE_CODE (lhs) == SSA_NAME)
- FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
- {
- if (is_gimple_debug (USE_STMT (use_p)))
- continue;
- use_stmt = USE_STMT (use_p);
-
- if (!flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
- continue;
-
- if (vinfo_for_stmt (use_stmt)
- && STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (use_stmt)))
- {
- found = true;
- break;
- }
- }
- }
+ /* This is the last stmt in a sequence that was detected as a
+ pattern that can potentially be vectorized. Don't mark the stmt
+ as relevant/live because it's not going to be vectorized.
+ Instead mark the pattern-stmt that replaces it. */
- if (!found)
- {
- /* This is the last stmt in a sequence that was detected as a
- pattern that can potentially be vectorized. Don't mark the stmt
- as relevant/live because it's not going to be vectorized.
- Instead mark the pattern-stmt that replaces it. */
-
- pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
+ pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
- if (dump_enabled_p ())
- dump_printf_loc (MSG_NOTE, vect_location,
- "last stmt in pattern. don't mark"
- " relevant/live.\n");
- stmt_info = vinfo_for_stmt (pattern_stmt);
- gcc_assert (STMT_VINFO_RELATED_STMT (stmt_info) == stmt);
- save_relevant = STMT_VINFO_RELEVANT (stmt_info);
- save_live_p = STMT_VINFO_LIVE_P (stmt_info);
- stmt = pattern_stmt;
- }
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "last stmt in pattern. don't mark"
+ " relevant/live.\n");
+ stmt_info = vinfo_for_stmt (pattern_stmt);
+ gcc_assert (STMT_VINFO_RELATED_STMT (stmt_info) == stmt);
+ save_relevant = STMT_VINFO_RELEVANT (stmt_info);
+ save_live_p = STMT_VINFO_LIVE_P (stmt_info);
+ stmt = pattern_stmt;
}
STMT_VINFO_LIVE_P (stmt_info) |= live_p;
}
}
- vect_mark_relevant (worklist, def_stmt, relevant, live_p,
- is_pattern_stmt_p (stmt_vinfo));
+ vect_mark_relevant (worklist, def_stmt, relevant, live_p);
return true;
}
}
if (vect_stmt_relevant_p (phi, loop_vinfo, &relevant, &live_p))
- vect_mark_relevant (&worklist, phi, relevant, live_p, false);
+ vect_mark_relevant (&worklist, phi, relevant, live_p);
}
for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
{
}
if (vect_stmt_relevant_p (stmt, loop_vinfo, &relevant, &live_p))
- vect_mark_relevant (&worklist, stmt, relevant, live_p, false);
+ vect_mark_relevant (&worklist, stmt, relevant, live_p);
}
}