Handle polynomial DR_INIT

Message ID 87bmhz195t.fsf_-_@linaro.org
State New
Headers show
Series
  • Handle polynomial DR_INIT
Related show

Commit Message

Richard Sandiford Jan. 12, 2018, 1:47 p.m.
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.

Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
Also tested by comparing the before-and-after assembly output for at
least one target per CPU directory.  OK to install?

Thanks,
Richard


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.

Comments

Richard Biener Jan. 12, 2018, 2:23 p.m. | #1
On Fri, Jan 12, 2018 at 2:47 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> 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.

>

> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

> Also tested by comparing the before-and-after assembly output for at

> least one target per CPU directory.  OK to install?


Ok.

Richard.

> Thanks,

> Richard

>

>

> 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.

>

> Index: gcc/tree-predcom.c

> ===================================================================

> --- gcc/tree-predcom.c  2018-01-12 13:45:27.360582269 +0000

> +++ gcc/tree-predcom.c  2018-01-12 13:45:27.533575091 +0000

> @@ -680,7 +680,7 @@ aff_combination_dr_offset (struct data_r

>

>    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: gcc/tree-vect-data-refs.c

> ===================================================================

> --- gcc/tree-vect-data-refs.c   2018-01-12 13:45:27.360582269 +0000

> +++ gcc/tree-vect-data-refs.c   2018-01-12 13:45:27.533575091 +0000

> @@ -2227,9 +2227,9 @@ vect_find_same_alignment_drs (struct dat

>      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 dat

>        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

>        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

>                                    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));

Patch

Index: gcc/tree-predcom.c
===================================================================
--- gcc/tree-predcom.c	2018-01-12 13:45:27.360582269 +0000
+++ gcc/tree-predcom.c	2018-01-12 13:45:27.533575091 +0000
@@ -680,7 +680,7 @@  aff_combination_dr_offset (struct data_r
 
   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: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c	2018-01-12 13:45:27.360582269 +0000
+++ gcc/tree-vect-data-refs.c	2018-01-12 13:45:27.533575091 +0000
@@ -2227,9 +2227,9 @@  vect_find_same_alignment_drs (struct dat
     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 dat
       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
       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
 				   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));