This replaces the gimple_build_nop () used for making loop control mask variable
with an IFN_VARYING and then actually adding the statement to the IL.

The bug happens because the mask def statement itself is not in the IL but
computations that use it are.  As such dataflow analysis fails as it tries to
analyze the use/def chain of these expressions.

When the value if known we replace the IFN_VARYING with the final statement.

Bootstrapped Regtested on aarch64-none-linux-gnu,
arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
-m32, -m64 and no issues.

Any comments? Does this do what you expected Richi?

Thanks,
Tamar

gcc/ChangeLog:

        PR tree-optimization/125597
        (vect_do_peeling): Create IFN_VARYING for masks.
        * tree-vect-loop-manip.cc (vect_set_loop_condition): Replace the
        IFN_VARYING.

gcc/testsuite/ChangeLog:

        PR tree-optimization/125597
        * gcc.target/aarch64/pr125597.c: New test.

---
diff --git a/gcc/testsuite/gcc.target/aarch64/pr125597.c 
b/gcc/testsuite/gcc.target/aarch64/pr125597.c
new file mode 100644
index 
0000000000000000000000000000000000000000..895ecfa0f9baa6f5a04b083cf9da1dff28a975fa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr125597.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mcpu=c1-ultra -mautovec-preference=sve-only" } */
+
+_BitInt(256) b;
+
+void
+foo()
+{
+  for (;;)
+    b ^= 0x100000000020000000000000000000000000000000000wb;
+}
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 
584d243a403b2534d9c70d6e5ed480fc88a520c4..4a3444966acf5d66394196caf24dc3ba2fa63ec3
 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -1402,6 +1402,19 @@ vect_set_loop_condition (class loop *loop, edge loop_e, 
loop_vec_info loop_vinfo
   gcond *orig_cond = get_loop_exit_condition (loop_e);
   gimple_stmt_iterator loop_cond_gsi = gsi_for_stmt (orig_cond);
 
+  /* Check to see whether we will be replacing final_IV below.  Because of the
+     various replacement strategies (assign vs PHI) just remove it now and
+     leave the SSA name to be rebuild below.  */
+  if (final_iv && TREE_CODE (final_iv) == SSA_NAME)
+    {
+      gimple *def = SSA_NAME_DEF_STMT (final_iv);
+      if (gimple_call_internal_p (def, IFN_VARYING))
+       {
+         gimple_stmt_iterator gsi = gsi_for_stmt (def);
+         gsi_remove (&gsi, true);
+       }
+    }
+
   if (loop_vinfo && LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo))
     {
       if (LOOP_VINFO_PARTIAL_VECTORS_STYLE (loop_vinfo) == 
vect_partial_vectors_avx512)
@@ -3743,7 +3756,13 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, 
tree nitersm1,
                 until then.  */
              niters_vector_mult_vf
                = make_ssa_name (TREE_TYPE (*niters_vector));
-             SSA_NAME_DEF_STMT (niters_vector_mult_vf) = gimple_build_nop ();
+             edge exit_e = LOOP_VINFO_MAIN_EXIT (loop_vinfo);
+             gimple_stmt_iterator loop_cond_gsi
+               = gsi_after_labels (exit_e->dest);
+
+             gcall *tmp = gimple_build_call_internal (IFN_VARYING, 0);
+             gimple_call_set_lhs (tmp, niters_vector_mult_vf);
+             gsi_insert_before (&loop_cond_gsi, tmp, GSI_SAME_STMT);
              *niters_vector_mult_vf_var = niters_vector_mult_vf;
            }
          else


-- 
diff --git a/gcc/testsuite/gcc.target/aarch64/pr125597.c b/gcc/testsuite/gcc.target/aarch64/pr125597.c
new file mode 100644
index 0000000000000000000000000000000000000000..895ecfa0f9baa6f5a04b083cf9da1dff28a975fa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr125597.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mcpu=c1-ultra -mautovec-preference=sve-only" } */
+
+_BitInt(256) b;
+
+void
+foo()
+{
+  for (;;)
+    b ^= 0x100000000020000000000000000000000000000000000wb;
+}
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index 584d243a403b2534d9c70d6e5ed480fc88a520c4..4a3444966acf5d66394196caf24dc3ba2fa63ec3 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -1402,6 +1402,19 @@ vect_set_loop_condition (class loop *loop, edge loop_e, loop_vec_info loop_vinfo
   gcond *orig_cond = get_loop_exit_condition (loop_e);
   gimple_stmt_iterator loop_cond_gsi = gsi_for_stmt (orig_cond);
 
+  /* Check to see whether we will be replacing final_IV below.  Because of the
+     various replacement strategies (assign vs PHI) just remove it now and
+     leave the SSA name to be rebuild below.  */
+  if (final_iv && TREE_CODE (final_iv) == SSA_NAME)
+    {
+      gimple *def = SSA_NAME_DEF_STMT (final_iv);
+      if (gimple_call_internal_p (def, IFN_VARYING))
+	{
+	  gimple_stmt_iterator gsi = gsi_for_stmt (def);
+	  gsi_remove (&gsi, true);
+	}
+    }
+
   if (loop_vinfo && LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo))
     {
       if (LOOP_VINFO_PARTIAL_VECTORS_STYLE (loop_vinfo) == vect_partial_vectors_avx512)
@@ -3743,7 +3756,13 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1,
 		 until then.  */
 	      niters_vector_mult_vf
 		= make_ssa_name (TREE_TYPE (*niters_vector));
-	      SSA_NAME_DEF_STMT (niters_vector_mult_vf) = gimple_build_nop ();
+	      edge exit_e = LOOP_VINFO_MAIN_EXIT (loop_vinfo);
+	      gimple_stmt_iterator loop_cond_gsi
+		= gsi_after_labels (exit_e->dest);
+
+	      gcall *tmp = gimple_build_call_internal (IFN_VARYING, 0);
+	      gimple_call_set_lhs (tmp, niters_vector_mult_vf);
+	      gsi_insert_before (&loop_cond_gsi, tmp, GSI_SAME_STMT);
 	      *niters_vector_mult_vf_var = niters_vector_mult_vf;
 	    }
 	  else

Reply via email to