Handle polynomial DR_INIT
authorRichard Sandiford <richard.sandiford@linaro.org>
Fri, 12 Jan 2018 14:48:53 +0000 (14:48 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 12 Jan 2018 14:48:53 +0000 (14:48 +0000)
The idea with the main 107-patch poly_int series (latterly 109-patch)
was to change the mode sizes and vector element counts to poly_int and
then propagate those changes as far as they needed to go to fix build
failures from incompatible types.  This means that DR_INIT is now
constructed as a poly_int64:

  poly_int64 pbytepos;
  if (!multiple_p (pbitpos, BITS_PER_UNIT, &pbytepos))
    {
      if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "failed: bit offset alignment.\n");
      return false;
    }
  [...]
  init = ssize_int (pbytepos);

This patch adjusts other references to DR_INIT accordingly.  Unlike
the above, the adjustments weren't needed to avoid a build-time type
incompatibility, but they are needed to make the producer and consumers
of DR_INIT logically consistent.

2018-01-12  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* tree-predcom.c (aff_combination_dr_offset): Use wi::to_poly_widest
rather than wi::to_widest for DR_INITs.
* tree-vect-data-refs.c (vect_find_same_alignment_drs): Use
wi::to_poly_offset rather than wi::to_offset for DR_INIT.
(vect_analyze_data_ref_accesses): Require both DR_INITs to be
INTEGER_CSTs.
(vect_analyze_group_access_1): Note that here.

From-SVN: r256587

gcc/ChangeLog
gcc/tree-predcom.c
gcc/tree-vect-data-refs.c

index 7195a2a729f0b4720eb6f7b59077c9f374579eec..752c77731e21abd91df22083d18f75ced3d9811b 100644 (file)
@@ -1,3 +1,13 @@
+2018-01-12  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * tree-predcom.c (aff_combination_dr_offset): Use wi::to_poly_widest
+       rather than wi::to_widest for DR_INITs.
+       * tree-vect-data-refs.c (vect_find_same_alignment_drs): Use
+       wi::to_poly_offset rather than wi::to_offset for DR_INIT.
+       (vect_analyze_data_ref_accesses): Require both DR_INITs to be
+       INTEGER_CSTs.
+       (vect_analyze_group_access_1): Note that here.
+
 2018-01-12  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * tree-vectorizer.c (get_vec_alignment_for_array_type): Handle
index 0fe46f04320ea3ee4d5511bb2ab3ae11de8c8d4e..2bde732f8ad8dd0a142f71bfcdec214a79897c5f 100644 (file)
@@ -680,7 +680,7 @@ aff_combination_dr_offset (struct data_reference *dr, aff_tree *offset)
 
   tree_to_aff_combination_expand (DR_OFFSET (dr), type, offset,
                                  &name_expansions);
-  aff_combination_const (&delta, type, wi::to_widest (DR_INIT (dr)));
+  aff_combination_const (&delta, type, wi::to_poly_widest (DR_INIT (dr)));
   aff_combination_add (offset, &delta);
 }
 
index e0a2f7b7c890aa8e450801a7e9c0eaf9878c219d..eb82594259807060c3f20483c3a3171c940b3533 100644 (file)
@@ -2227,9 +2227,9 @@ vect_find_same_alignment_drs (struct data_dependence_relation *ddr)
     return;
 
   /* Two references with distance zero have the same alignment.  */
-  offset_int diff = (wi::to_offset (DR_INIT (dra))
-                    - wi::to_offset (DR_INIT (drb)));
-  if (diff != 0)
+  poly_offset_int diff = (wi::to_poly_offset (DR_INIT (dra))
+                         - wi::to_poly_offset (DR_INIT (drb)));
+  if (maybe_ne (diff, 0))
     {
       /* Get the wider of the two alignments.  */
       unsigned int align_a = (vect_calculate_target_alignment (dra)
@@ -2239,7 +2239,7 @@ vect_find_same_alignment_drs (struct data_dependence_relation *ddr)
       unsigned int max_align = MAX (align_a, align_b);
 
       /* Require the gap to be a multiple of the larger vector alignment.  */
-      if (!wi::multiple_of_p (diff, max_align, SIGNED))
+      if (!multiple_p (diff, max_align))
        return;
     }
 
@@ -2475,6 +2475,7 @@ vect_analyze_group_access_1 (struct data_reference *dr)
       gimple *prev = stmt;
       HOST_WIDE_INT diff, gaps = 0;
 
+      /* By construction, all group members have INTEGER_CST DR_INITs.  */
       while (next)
         {
           /* Skip same data-refs.  In case that two or more stmts share
@@ -2864,6 +2865,11 @@ vect_analyze_data_ref_accesses (vec_info *vinfo)
                                   TREE_TYPE (DR_REF (drb))))
            break;
 
+         /* Check that the DR_INITs are compile-time constants.  */
+         if (TREE_CODE (DR_INIT (dra)) != INTEGER_CST
+             || TREE_CODE (DR_INIT (drb)) != INTEGER_CST)
+           break;
+
          /* Sorting has ensured that DR_INIT (dra) <= DR_INIT (drb).  */
          HOST_WIDE_INT init_a = TREE_INT_CST_LOW (DR_INIT (dra));
          HOST_WIDE_INT init_b = TREE_INT_CST_LOW (DR_INIT (drb));