Move canonicalisation of dr_with_seg_len_pair_ts
authorRichard Sandiford <richard.sandiford@arm.com>
Sat, 16 Nov 2019 11:35:08 +0000 (11:35 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sat, 16 Nov 2019 11:35:08 +0000 (11:35 +0000)
The two users of tree-data-ref's runtime alias checks both canonicalise
the order of the dr_with_seg_lens in a pair before passing them to
prune_runtime_alias_test_list.  It's more convenient for later patches
if prune_runtime_alias_test_list does that itself.

2019-11-16  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-data-ref.c (prune_runtime_alias_test_list): Sort the
two accesses in each dr_with_seg_len_pair_t before trying to
combine separate dr_with_seg_len_pair_ts.
* tree-loop-distribution.c (compute_alias_check_pairs): Don't do
that here.
* tree-vect-data-refs.c (vect_prune_runtime_alias_test_list): Likewise.

From-SVN: r278348

gcc/ChangeLog
gcc/tree-data-ref.c
gcc/tree-loop-distribution.c
gcc/tree-vect-data-refs.c

index 2a9d5871179de07855d6696563d9284c65ca2ad9..f75f3cb3a56b04003c25a1970c0fcfd665a3def1 100644 (file)
@@ -1,3 +1,12 @@
+2019-11-16  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-data-ref.c (prune_runtime_alias_test_list): Sort the
+       two accesses in each dr_with_seg_len_pair_t before trying to
+       combine separate dr_with_seg_len_pair_ts.
+       * tree-loop-distribution.c (compute_alias_check_pairs): Don't do
+       that here.
+       * tree-vect-data-refs.c (vect_prune_runtime_alias_test_list): Likewise.
+
 2019-11-16  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/aarch64/aarch64-sve.md
index 191beb9df99fc89f417b286f0eef827be0fa1937..b31ed4247dd948a05ee11cffda9fceb1d2b5c9bf 100644 (file)
@@ -1486,13 +1486,32 @@ void
 prune_runtime_alias_test_list (vec<dr_with_seg_len_pair_t> *alias_pairs,
                               poly_uint64)
 {
+  /* Canonicalize each pair so that the base components are ordered wrt
+     data_ref_compare_tree.  This allows the loop below to merge more
+     cases.  */
+  unsigned int i;
+  dr_with_seg_len_pair_t *alias_pair;
+  FOR_EACH_VEC_ELT (*alias_pairs, i, alias_pair)
+    {
+      data_reference_p dr_a = alias_pair->first.dr;
+      data_reference_p dr_b = alias_pair->second.dr;
+      int comp_res = data_ref_compare_tree (DR_BASE_ADDRESS (dr_a),
+                                           DR_BASE_ADDRESS (dr_b));
+      if (comp_res == 0)
+       comp_res = data_ref_compare_tree (DR_OFFSET (dr_a), DR_OFFSET (dr_b));
+      if (comp_res == 0)
+       comp_res = data_ref_compare_tree (DR_INIT (dr_a), DR_INIT (dr_b));
+      if (comp_res > 0)
+       std::swap (alias_pair->first, alias_pair->second);
+    }
+
   /* Sort the collected data ref pairs so that we can scan them once to
      combine all possible aliasing checks.  */
   alias_pairs->qsort (comp_dr_with_seg_len_pair);
 
   /* Scan the sorted dr pairs and check if we can combine alias checks
      of two neighboring dr pairs.  */
-  for (size_t i = 1; i < alias_pairs->length (); ++i)
+  for (i = 1; i < alias_pairs->length (); ++i)
     {
       /* Deal with two ddrs (dr_a1, dr_b1) and (dr_a2, dr_b2).  */
       dr_with_seg_len *dr_a1 = &(*alias_pairs)[i-1].first,
index 39e17e23160ca92a590e8a681e8b18d32cb18cb8..29f8eab59a9e68fb364b03a2d1c9a5cdfd279690 100644 (file)
@@ -2456,12 +2456,6 @@ compute_alias_check_pairs (class loop *loop, vec<ddr_p> *alias_ddrs,
       struct data_reference *dr_a = DDR_A (ddr);
       struct data_reference *dr_b = DDR_B (ddr);
       tree seg_length_a, seg_length_b;
-      int comp_res = data_ref_compare_tree (DR_BASE_ADDRESS (dr_a),
-                                           DR_BASE_ADDRESS (dr_b));
-
-      if (comp_res == 0)
-       comp_res = data_ref_compare_tree (DR_OFFSET (dr_a), DR_OFFSET (dr_b));
-      gcc_assert (comp_res != 0);
 
       if (latch_dominated_by_data_ref (loop, dr_a))
        seg_length_a = data_ref_segment_size (dr_a, niters_plus_one);
@@ -2484,10 +2478,6 @@ compute_alias_check_pairs (class loop *loop, vec<ddr_p> *alias_ddrs,
        (dr_with_seg_len (dr_a, seg_length_a, access_size_a, align_a),
         dr_with_seg_len (dr_b, seg_length_b, access_size_b, align_b));
 
-      /* Canonicalize pairs by sorting the two DR members.  */
-      if (comp_res > 0)
-       std::swap (dr_with_seg_len_pair.first, dr_with_seg_len_pair.second);
-
       comp_alias_pairs->safe_push (dr_with_seg_len_pair);
     }
 
index 87973b214532f834d3b4b1de4251f431da41f3a2..c4d627acb2e5ce1c838e52d4ba111d0466f0979d 100644 (file)
@@ -3477,7 +3477,6 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo)
   /* First, we collect all data ref pairs for aliasing checks.  */
   FOR_EACH_VEC_ELT (may_alias_ddrs, i, ddr)
     {
-      int comp_res;
       poly_uint64 lower_bound;
       tree segment_length_a, segment_length_b;
       unsigned HOST_WIDE_INT access_size_a, access_size_b;
@@ -3593,14 +3592,11 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo)
       align_a = vect_vfa_align (dr_info_a);
       align_b = vect_vfa_align (dr_info_b);
 
-      comp_res = data_ref_compare_tree (DR_BASE_ADDRESS (dr_info_a->dr),
-                                       DR_BASE_ADDRESS (dr_info_b->dr));
-      if (comp_res == 0)
-       comp_res = data_ref_compare_tree (DR_OFFSET (dr_info_a->dr),
-                                         DR_OFFSET (dr_info_b->dr));
-
       /* See whether the alias is known at compilation time.  */
-      if (comp_res == 0
+      if (operand_equal_p (DR_BASE_ADDRESS (dr_info_a->dr),
+                          DR_BASE_ADDRESS (dr_info_b->dr), 0)
+         && operand_equal_p (DR_OFFSET (dr_info_a->dr),
+                             DR_OFFSET (dr_info_b->dr), 0)
          && TREE_CODE (DR_STEP (dr_info_a->dr)) == INTEGER_CST
          && TREE_CODE (DR_STEP (dr_info_b->dr)) == INTEGER_CST
          && poly_int_tree_p (segment_length_a)
@@ -3639,10 +3635,6 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo)
         dr_with_seg_len (dr_info_b->dr, segment_length_b,
                          access_size_b, align_b));
 
-      /* Canonicalize pairs by sorting the two DR members.  */
-      if (comp_res > 0)
-       std::swap (dr_with_seg_len_pair.first, dr_with_seg_len_pair.second);
-
       comp_alias_ddrs.safe_push (dr_with_seg_len_pair);
     }