On 15 Oct 16:23, Richard Biener wrote: > > +static bool > > +initialize_offload (void) > > +{ > > + bool have_offload = false; > > + struct cgraph_node *node; > > + struct varpool_node *vnode; > > + > > + FOR_EACH_DEFINED_FUNCTION (node) > > + if (lookup_attribute ("omp declare target", DECL_ATTRIBUTES > > (node->decl))) > > + { > > + have_offload = true; > > + break; > > + } > > + > > + FOR_EACH_DEFINED_VARIABLE (vnode) > > + { > > + if (!lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES (vnode->decl)) > > + || TREE_CODE (vnode->decl) != VAR_DECL > > + || DECL_SIZE (vnode->decl) == 0) > > + continue; > > + have_offload = true; > > + } > > + > > + return have_offload; > > +} > > + > > I wonder if we can avoid the above by means of a global have_offload > flag? (or inside gcc::context)
So you propose to set global have_offload flag somewhere in expand_omp_target, etc. where functions and global variables are created? > > static void > > ipa_passes (void) > > { > > + bool have_offload = false; > > gcc::pass_manager *passes = g->get_passes (); > > > > set_cfun (NULL); > > @@ -2004,6 +2036,14 @@ ipa_passes (void) > > gimple_register_cfg_hooks (); > > bitmap_obstack_initialize (NULL); > > > > + if (!in_lto_p && flag_openmp) > > As -fopenmp is not generally available it's odd to test > flag_openmp (though that is available everywhere as > implementation detail). Doesn't offloading work > without -fopenmp? In this patch series offloading is implemented only for OpenMP. OpenACC guys will add flag_openacc here. > > /* If LTO is enabled, initialize the streamer hooks needed by GIMPLE. */ > > - if (flag_lto) > > + if (flag_lto || flag_openmp) > > flag_generate_lto? > > > /* When not optimizing, do not bother to analyze. Inlining is still done > > because edge redirection needs to happen there. */ > > - if (!optimize && !flag_lto && !flag_wpa) > > + if (!optimize && !flag_lto && !flag_wpa && !flag_openmp) > > return; > > Likewise !flag_generate_lto Currently this is not working, since symbol_table::compile is executed before ipa_passes. But with global have_offload it should work. > > +/* Select what needs to be streamed out. In regular lto mode stream > > everything. > > + In offload lto mode stream only stuff marked with an attribute. */ > > +void > > +select_what_to_stream (bool offload_lto_mode) > > +{ > > + struct symtab_node *snode; > > + FOR_EACH_SYMBOL (snode) > > + snode->need_lto_streaming > > + = !offload_lto_mode || lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES (snode->decl)); > > I suppose I suggested this already earlier this year. Why keep this > artificial attribute when you have a cgraph node flag? > > + /* If '#pragma omp critical' is inside target region, the symbol must > > + have an 'omp declare target' attribute. */ > > + omp_context *octx; > > + for (octx = ctx->outer; octx; octx = octx->outer) > > + if (is_targetreg_ctx (octx)) > > + { > > + DECL_ATTRIBUTES (decl) > > + = tree_cons (get_identifier ("omp declare target"), > > + NULL_TREE, DECL_ATTRIBUTES (decl)); > > Here - why not set a flag on cgraph_get_node (decl) instead? I thought that select_what_to_stream is exactly what you've suggested. Could you please clarify this? You propose to replace "omp declare target" attribure with some cgraph node flag like need_offload? But we'll need need_lto_streaming anyway, since for LTO it should be 1 for all nodes, but for offloading it should be equal to need_offload. Thanks, -- Ilya