Hi,
Function vect_slp_analyze_node_dependences delays data-dependence check for 
visited store stmts until we run into the last store, because all stores are 
sunk/vectorized at the position of the last one.  The problem is that it still 
checks data-dep for current store stmt after the delay part of code.  This is 
unnecessary no matter the last store stmt is encountered or not.  This patch 
fixes the issue by simple refactoring.  Bootstrap and test on x86_64.  Is it OK?

Thanks,
bin

2016-10-27  Bin Cheng  <bin.ch...@arm.com>

        * tree-vect-data-refs.c (vect_slp_analyze_node_dependences): Skip
        unnecessary data dependence check after visited store stmt.
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index c99fa40..9346cfe 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -583,6 +583,7 @@ vect_slp_analyze_node_dependences (slp_instance instance, 
slp_tree node,
          if (!dr_b)
            return false;
 
+         bool dependent = false;
          /* If we run into a store of this same instance (we've just
             marked those) then delay dependence checking until we run
             into the last store because this is where it will have
@@ -599,22 +600,21 @@ vect_slp_analyze_node_dependences (slp_instance instance, 
slp_tree node,
                    = STMT_VINFO_DATA_REF (vinfo_for_stmt (store));
                  ddr_p ddr = initialize_data_dependence_relation
                                (dr_a, store_dr, vNULL);
-                 if (vect_slp_analyze_data_ref_dependence (ddr))
-                   {
-                     free_dependence_relation (ddr);
-                     return false;
-                   }
+                 dependent = vect_slp_analyze_data_ref_dependence (ddr);
                  free_dependence_relation (ddr);
+                 if (dependent)
+                   break;
                }
            }
-
-         ddr_p ddr = initialize_data_dependence_relation (dr_a, dr_b, vNULL);
-         if (vect_slp_analyze_data_ref_dependence (ddr))
+         else
            {
+             ddr_p ddr = initialize_data_dependence_relation (dr_a,
+                                                              dr_b, vNULL);
+             dependent = vect_slp_analyze_data_ref_dependence (ddr);
              free_dependence_relation (ddr);
-             return false;
            }
-         free_dependence_relation (ddr);
+         if (dependent)
+           return false;
        }
     }
   return true;

Reply via email to