omp-offload: use PROP_gimple_lomp_dev
authorAlexander Monakov <amonakov@ispras.ru>
Fri, 20 Jan 2017 14:38:18 +0000 (17:38 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Fri, 20 Jan 2017 14:38:18 +0000 (17:38 +0300)
* omp-expand.c (expand_omp_simd): Clear PROP_gimple_lomp_dev regardless
of safelen status.
* omp-offload.c (pass_omp_device_lower::gate): Use PROP_gimple_lomp_dev.
* passes.c (dump_properties): Handle PROP_gimple_lomp_dev.
* tree-inline.c (expand_call_inline): Propagate PROP_gimple_lomp_dev.

From-SVN: r244717

gcc/ChangeLog
gcc/omp-expand.c
gcc/omp-offload.c
gcc/passes.c
gcc/tree-inline.c

index 760869e04c57c33f720839060f25c6a0134a497c..0b3d0c98bb0f4a3dd4e8162e4757a943e0ada153 100644 (file)
@@ -1,3 +1,11 @@
+2017-01-20  Alexander Monakov  <amonakov@ispras.ru>
+
+       * omp-expand.c (expand_omp_simd): Clear PROP_gimple_lomp_dev regardless
+       of safelen status.
+       * omp-offload.c (pass_omp_device_lower::gate): Use PROP_gimple_lomp_dev.
+       * passes.c (dump_properties): Handle PROP_gimple_lomp_dev.
+       * tree-inline.c (expand_call_inline): Propagate PROP_gimple_lomp_dev.
+
 2017-01-20  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR target/71270
index 57d9fdea85ace02dff364bd9ee72953e01b6983c..d3891e3175e1554c11b9c0db2c29699c8e907dff 100644 (file)
@@ -4590,13 +4590,16 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
     }
   tree step = fd->loop.step;
 
-  bool is_simt = (safelen_int > 1
-                 && omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
-                                     OMP_CLAUSE__SIMT_));
-  tree simt_lane = NULL_TREE, simt_maxlane = NULL_TREE;
+  bool is_simt = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
+                                 OMP_CLAUSE__SIMT_);
   if (is_simt)
     {
       cfun->curr_properties &= ~PROP_gimple_lomp_dev;
+      is_simt = safelen_int > 1;
+    }
+  tree simt_lane = NULL_TREE, simt_maxlane = NULL_TREE;
+  if (is_simt)
+    {
       simt_lane = create_tmp_var (unsigned_type_node);
       gimple *g = gimple_build_call_internal (IFN_GOMP_SIMT_LANE, 0);
       gimple_call_set_lhs (g, simt_lane);
index 77e003d5b560ed078d42ff29bbcee9519b0d0417..6ff6bc2eeb9557c463894ed4b862ff03f79ec8c4 100644 (file)
@@ -1613,14 +1613,9 @@ public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *ARG_UNUSED (fun))
+  virtual bool gate (function *fun)
     {
-      /* FIXME: this should use PROP_gimple_lomp_dev.  */
-#ifdef ACCEL_COMPILER
-      return true;
-#else
-      return ENABLE_OFFLOADING && (flag_openmp || in_lto_p);
-#endif
+      return !(fun->curr_properties & PROP_gimple_lomp_dev);
     }
   virtual unsigned int execute (function *)
     {
index 31262edbd0991da8efb09f4b9ee9a2ff68c46fc9..ace68b8ee7a4a7d831520ca8b5170c69e07325bb 100644 (file)
@@ -2929,6 +2929,8 @@ dump_properties (FILE *dump, unsigned int props)
     fprintf (dump, "PROP_rtl\n");
   if (props & PROP_gimple_lomp)
     fprintf (dump, "PROP_gimple_lomp\n");
+  if (props & PROP_gimple_lomp_dev)
+    fprintf (dump, "PROP_gimple_lomp_dev\n");
   if (props & PROP_gimple_lcx)
     fprintf (dump, "PROP_gimple_lcx\n");
   if (props & PROP_gimple_lvec)
index ac72039f12adb911c7edd2091c89c0a15e5707d2..42055bd83186cd5e44c5538b7ad923e77ef157da 100644 (file)
@@ -4413,6 +4413,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
   bool purge_dead_abnormal_edges;
   gcall *call_stmt;
   unsigned int i;
+  unsigned int prop_mask, src_properties;
 
   /* The gimplifier uses input_location in too many places, such as
      internal_get_tmp_var ().  */
@@ -4617,11 +4618,13 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
   id->call_stmt = stmt;
 
   /* If the src function contains an IFN_VA_ARG, then so will the dst
-     function after inlining.  */
-  if ((id->src_cfun->curr_properties & PROP_gimple_lva) == 0)
+     function after inlining.  Likewise for IFN_GOMP_USE_SIMT.  */
+  prop_mask = PROP_gimple_lva | PROP_gimple_lomp_dev;
+  src_properties = id->src_cfun->curr_properties & prop_mask;
+  if (src_properties != prop_mask)
     {
       struct function *dst_cfun = DECL_STRUCT_FUNCTION (id->dst_fn);
-      dst_cfun->curr_properties &= ~PROP_gimple_lva;
+      dst_cfun->curr_properties &= src_properties | ~prop_mask;
     }
 
   gcc_assert (!id->src_cfun->after_inlining);