Hi! On Tue, 21 Jul 2015 10:15:05 -0700, Cesar Philippidis <ce...@codesourcery.com> wrote: > Jakub, > > Nathan pointed out that I should make the fold_oacc_reductions pass that > I introduced in my reduction patch more generic so that other openacc > transformations may use it. This patch introduces an empty skeleton pass > called oacc_transform. Currently I'm stashing it inside omp-low.c. Is > that a good place for it, or should I move it to it's own separate file? > > The motivation behind this pass is to allow us to generate > target-specific code in a generic manner. E.g., for reductions, I'm > emitting calls to internal functions during lowering, then later on in > this pass I'm expanding those calls using target machine hooks. This > pass will run after lto on the target compiler.
(Another use case for this is to evaluate acc_on_device with compile-time constant argument earlier than currently.) Jakub, is this conceptually OK, or even OK to commit to trunk already? Cesar, please address the following compiler diagnostig: > 2015-07-21 Cesar Philippidis <ce...@codesourcery.com> > > gcc/ > * omp-low.c (execute_oacc_transform): New function. > (class pass_oacc_transform): New function. > (make_pass_oacc_transform): New function. > * passes.def: Add pass_oacc_transform to all_passes. > * tree-pass.h (make_pass_oacc_transform): Declare. > > > diff --git a/gcc/omp-low.c b/gcc/omp-low.c > index 388013c..23989f9 100644 > --- a/gcc/omp-low.c > +++ b/gcc/omp-low.c > @@ -14394,4 +14394,76 @@ make_pass_late_lower_omp (gcc::context *ctxt) > return new pass_late_lower_omp (ctxt); > } > > +/* Main entry point for oacc transformations which run on the device > + compiler. */ > + > +static unsigned int > +execute_oacc_transform () > +{ > + basic_block bb; > + gimple_stmt_iterator gsi; > + gimple stmt; > + > + if (!lookup_attribute ("oacc function", > + DECL_ATTRIBUTES (current_function_decl))) > + return 0; > + > + > + FOR_ALL_BB_FN (bb, cfun) > + { > + gsi = gsi_start_bb (bb); > + > + while (!gsi_end_p (gsi)) > + { > + stmt = gsi_stmt (gsi); > + gsi_next (&gsi); > + } > + } > + > + return 0; > +} [...]/source-gcc/gcc/omp-low.c: In function 'unsigned int execute_oacc_transform()': [...]/source-gcc/gcc/omp-low.c:14406:10: error: variable 'stmt' set but not used [-Werror=unused-but-set-variable] gimple stmt; ^ > + > +namespace { > + > +const pass_data pass_data_oacc_transform = > +{ > + GIMPLE_PASS, /* type */ > + "fold_oacc_transform", /* name */ > + OPTGROUP_NONE, /* optinfo_flags */ > + TV_NONE, /* tv_id */ > + PROP_cfg, /* properties_required */ > + 0 /* Possibly PROP_gimple_eomp. */, /* properties_provided */ > + 0, /* properties_destroyed */ > + 0, /* todo_flags_start */ > + TODO_update_ssa, /* todo_flags_finish */ > +}; > + > +class pass_oacc_transform : public gimple_opt_pass > +{ > +public: > + pass_oacc_transform (gcc::context *ctxt) > + : gimple_opt_pass (pass_data_oacc_transform, ctxt) > + {} > + > + /* opt_pass methods: */ > + virtual unsigned int execute (function *) > + { > + bool gate = (flag_openacc != 0 && !seen_error ()); > + > + if (!gate) > + return 0; > + > + return execute_oacc_transform (); > + } > + > +}; // class pass_oacc_transform > + > +} // anon namespace > + > +gimple_opt_pass * > +make_pass_oacc_transform (gcc::context *ctxt) > +{ > + return new pass_oacc_transform (ctxt); > +} > + > #include "gt-omp-low.h" > diff --git a/gcc/passes.def b/gcc/passes.def > index 43e67df..6a2b095 100644 > --- a/gcc/passes.def > +++ b/gcc/passes.def > @@ -165,6 +165,7 @@ along with GCC; see the file COPYING3. If not see > INSERT_PASSES_AFTER (all_passes) > NEXT_PASS (pass_fixup_cfg); > NEXT_PASS (pass_lower_eh_dispatch); > + NEXT_PASS (pass_oacc_transform); > NEXT_PASS (pass_all_optimizations); > PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations) > NEXT_PASS (pass_remove_cgraph_callee_edges); > diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h > index 13f20ea..67dc017 100644 > --- a/gcc/tree-pass.h > +++ b/gcc/tree-pass.h > @@ -410,6 +410,7 @@ extern gimple_opt_pass *make_pass_late_lower_omp > (gcc::context *ctxt); > extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt); > extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt); > extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt); > +extern gimple_opt_pass *make_pass_oacc_transform (gcc::context *ctxt); > extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt); > extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt); > extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt); Grüße, Thomas
signature.asc
Description: PGP signature