poly_int: omp_max_vf
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 3 Jan 2018 07:14:31 +0000 (07:14 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 3 Jan 2018 07:14:31 +0000 (07:14 +0000)
This patch makes omp_max_vf return a polynomial vectorization factor.
We then need to be able to stash a polynomial value in
OMP_CLAUSE_SAFELEN_EXPR too:

   /* If max_vf is non-zero, then we can use only a vectorization factor
      up to the max_vf we chose.  So stick it into the safelen clause.  */

For now the cfgloop safelen is still constant though.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* omp-general.h (omp_max_vf): Return a poly_uint64 instead of an int.
* omp-general.c (omp_max_vf): Likewise.
* omp-expand.c (omp_adjust_chunk_size): Update call to omp_max_vf.
(expand_omp_simd): Handle polynomial safelen.
* omp-low.c (omplow_simd_context): Add a default constructor.
(omplow_simd_context::max_vf): Change from int to poly_uint64.
(lower_rec_simd_input_clauses): Update accordingly.
(lower_rec_input_clauses): Likewise.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256129

gcc/ChangeLog
gcc/omp-expand.c
gcc/omp-general.c
gcc/omp-general.h
gcc/omp-low.c

index 52a10ad2305a10629d0f0d25fb37cd5c389cd527..e373f88d5e6384fe16b6b70a44e7a129a992f629 100644 (file)
@@ -1,3 +1,16 @@
+2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * omp-general.h (omp_max_vf): Return a poly_uint64 instead of an int.
+       * omp-general.c (omp_max_vf): Likewise.
+       * omp-expand.c (omp_adjust_chunk_size): Update call to omp_max_vf.
+       (expand_omp_simd): Handle polynomial safelen.
+       * omp-low.c (omplow_simd_context): Add a default constructor.
+       (omplow_simd_context::max_vf): Change from int to poly_uint64.
+       (lower_rec_simd_input_clauses): Update accordingly.
+       (lower_rec_input_clauses): Likewise.
+
 2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 663711b3aa4913111180f15291c62b26beeaf4aa..aa580e2051fbb2f6c8334936794d1bbcc0230f52 100644 (file)
@@ -205,8 +205,8 @@ omp_adjust_chunk_size (tree chunk_size, bool simd_schedule)
   if (!simd_schedule)
     return chunk_size;
 
-  int vf = omp_max_vf ();
-  if (vf == 1)
+  poly_uint64 vf = omp_max_vf ();
+  if (known_eq (vf, 1U))
     return chunk_size;
 
   tree type = TREE_TYPE (chunk_size);
@@ -4368,11 +4368,12 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
 
   if (safelen)
     {
+      poly_uint64 val;
       safelen = OMP_CLAUSE_SAFELEN_EXPR (safelen);
-      if (TREE_CODE (safelen) != INTEGER_CST)
+      if (!poly_int_tree_p (safelen, &val))
        safelen_int = 0;
-      else if (tree_fits_uhwi_p (safelen) && tree_to_uhwi (safelen) < INT_MAX)
-       safelen_int = tree_to_uhwi (safelen);
+      else
+       safelen_int = MIN (constant_lower_bound (val), INT_MAX);
       if (safelen_int == 1)
        safelen_int = 0;
     }
index 0f53661e0cf525340da612a962efcc84e38f2948..826e1bea642db9a559ac99b18159f3812203c34c 100644 (file)
@@ -419,7 +419,7 @@ omp_build_barrier (tree lhs)
 
 /* Return maximum possible vectorization factor for the target.  */
 
-int
+poly_uint64
 omp_max_vf (void)
 {
   if (!optimize
index d28eb4bc4f6442ae44d4b73e81137a8b29317825..99a5e1dbd85b42950c1cbdbe04cc83b539e87562 100644 (file)
@@ -78,7 +78,7 @@ extern tree omp_get_for_step_from_incr (location_t loc, tree incr);
 extern void omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd,
                                  struct omp_for_data_loop *loops);
 extern gimple *omp_build_barrier (tree lhs);
-extern int omp_max_vf (void);
+extern poly_uint64 omp_max_vf (void);
 extern int omp_max_simt_vf (void);
 extern tree oacc_launch_pack (unsigned code, tree device, unsigned op);
 extern void oacc_replace_fn_attrib (tree fn, tree dims);
index 2b36732b0e0c84bf18c583d8e4bafb7c93ee276b..f6267ece858fe7f85c52bc708c01b42935b006e6 100644 (file)
@@ -3417,11 +3417,12 @@ omp_clause_aligned_alignment (tree clause)
    and lower_rec_input_clauses.  */
 
 struct omplow_simd_context {
+  omplow_simd_context () { memset (this, 0, sizeof (*this)); }
   tree idx;
   tree lane;
   vec<tree, va_heap> simt_eargs;
   gimple_seq simt_dlist;
-  int max_vf;
+  poly_uint64_pod max_vf;
   bool is_simt;
 };
 
@@ -3432,28 +3433,30 @@ static bool
 lower_rec_simd_input_clauses (tree new_var, omp_context *ctx,
                              omplow_simd_context *sctx, tree &ivar, tree &lvar)
 {
-  if (sctx->max_vf == 0)
+  if (known_eq (sctx->max_vf, 0U))
     {
       sctx->max_vf = sctx->is_simt ? omp_max_simt_vf () : omp_max_vf ();
-      if (sctx->max_vf > 1)
+      if (maybe_gt (sctx->max_vf, 1U))
        {
          tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt),
                                    OMP_CLAUSE_SAFELEN);
-         if (c
-             && (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) != INTEGER_CST
-                 || tree_int_cst_sgn (OMP_CLAUSE_SAFELEN_EXPR (c)) != 1))
-           sctx->max_vf = 1;
-         else if (c && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
-                                         sctx->max_vf) == -1)
-           sctx->max_vf = tree_to_shwi (OMP_CLAUSE_SAFELEN_EXPR (c));
+         if (c)
+           {
+             poly_uint64 safe_len;
+             if (!poly_int_tree_p (OMP_CLAUSE_SAFELEN_EXPR (c), &safe_len)
+                 || maybe_lt (safe_len, 1U))
+               sctx->max_vf = 1;
+             else
+               sctx->max_vf = lower_bound (sctx->max_vf, safe_len);
+           }
        }
-      if (sctx->max_vf > 1)
+      if (maybe_gt (sctx->max_vf, 1U))
        {
          sctx->idx = create_tmp_var (unsigned_type_node);
          sctx->lane = create_tmp_var (unsigned_type_node);
        }
     }
-  if (sctx->max_vf == 1)
+  if (known_eq (sctx->max_vf, 1U))
     return false;
 
   if (sctx->is_simt)
@@ -3567,7 +3570,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
        }
 
   /* Add a placeholder for simduid.  */
-  if (sctx.is_simt && sctx.max_vf != 1)
+  if (sctx.is_simt && maybe_ne (sctx.max_vf, 1U))
     sctx.simt_eargs.safe_push (NULL_TREE);
 
   /* Do all the fixed sized types in the first pass, and the variable sized
@@ -4457,7 +4460,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
        }
     }
 
-  if (sctx.max_vf == 1)
+  if (known_eq (sctx.max_vf, 1U))
     sctx.is_simt = false;
 
   if (sctx.lane || sctx.is_simt)
@@ -4594,14 +4597,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 
   /* If max_vf is non-zero, then we can use only a vectorization factor
      up to the max_vf we chose.  So stick it into the safelen clause.  */
-  if (sctx.max_vf)
+  if (maybe_ne (sctx.max_vf, 0U))
     {
       tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt),
                                OMP_CLAUSE_SAFELEN);
+      poly_uint64 safe_len;
       if (c == NULL_TREE
-         || (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) == INTEGER_CST
-             && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
-                                  sctx.max_vf) == 1))
+         || (poly_int_tree_p (OMP_CLAUSE_SAFELEN_EXPR (c), &safe_len)
+             && maybe_gt (safe_len, sctx.max_vf)))
        {
          c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN);
          OMP_CLAUSE_SAFELEN_EXPR (c) = build_int_cst (integer_type_node,