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