diff options
author | Tom de Vries <tom@codesourcery.com> | 2015-11-25 21:26:24 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2015-11-25 21:26:24 +0000 |
commit | 896522eec5e80bb93108053d95096de46fb21939 (patch) | |
tree | 369ab6215c76ec02c9c5f6a2ebf568c38a320056 /gcc/tree-ssa-loop.c | |
parent | faadf84ceb8eaaa82c6c7f10c64099630acbf069 (diff) | |
download | gcc-896522eec5e80bb93108053d95096de46fb21939.zip gcc-896522eec5e80bb93108053d95096de46fb21939.tar.gz gcc-896522eec5e80bb93108053d95096de46fb21939.tar.bz2 |
Add pass_oacc_kernels
2015-11-25 Tom de Vries <tom@codesourcery.com>
* tree-pass.h (make_pass_oacc_kernels, make_pass_oacc_kernels2):
Declare.
* tree-ssa-loop.c (gate_oacc_kernels): New static function.
(pass_data_oacc_kernels, pass_data_oacc_kernels2): New pass_data.
(class pass_oacc_kernels, class pass_oacc_kernels2): New pass.
(make_pass_oacc_kernels, make_pass_oacc_kernels2): New function.
From-SVN: r230906
Diffstat (limited to 'gcc/tree-ssa-loop.c')
-rw-r--r-- | gcc/tree-ssa-loop.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index afdef12..cf7d94e 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-inline.h" #include "tree-scalar-evolution.h" #include "tree-vectorizer.h" +#include "omp-low.h" /* A pass making sure loops are fixed up. */ @@ -141,6 +142,115 @@ make_pass_tree_loop (gcc::context *ctxt) return new pass_tree_loop (ctxt); } +/* Gate for oacc kernels pass group. */ + +static bool +gate_oacc_kernels (function *fn) +{ + if (flag_tree_parallelize_loops <= 1) + return false; + + tree oacc_function_attr = get_oacc_fn_attrib (fn->decl); + if (oacc_function_attr == NULL_TREE) + return false; + + tree val = TREE_VALUE (oacc_function_attr); + while (val != NULL_TREE && TREE_VALUE (val) == NULL_TREE) + val = TREE_CHAIN (val); + + if (val != NULL_TREE) + return false; + + struct loop *loop; + FOR_EACH_LOOP (loop, 0) + if (loop->in_oacc_kernels_region) + return true; + + return false; +} + +/* The oacc kernels superpass. */ + +namespace { + +const pass_data pass_data_oacc_kernels = +{ + GIMPLE_PASS, /* type */ + "oacc_kernels", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + TV_TREE_LOOP, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_oacc_kernels : public gimple_opt_pass +{ +public: + pass_oacc_kernels (gcc::context *ctxt) + : gimple_opt_pass (pass_data_oacc_kernels, ctxt) + {} + + /* opt_pass methods: */ + virtual bool gate (function *fn) { return gate_oacc_kernels (fn); } + +}; // class pass_oacc_kernels + +} // anon namespace + +gimple_opt_pass * +make_pass_oacc_kernels (gcc::context *ctxt) +{ + return new pass_oacc_kernels (ctxt); +} + +namespace { + +const pass_data pass_data_oacc_kernels2 = +{ + GIMPLE_PASS, /* type */ + "oacc_kernels2", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + TV_TREE_LOOP, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_oacc_kernels2 : public gimple_opt_pass +{ +public: + pass_oacc_kernels2 (gcc::context *ctxt) + : gimple_opt_pass (pass_data_oacc_kernels2, ctxt) + {} + + /* opt_pass methods: */ + virtual bool gate (function *fn) { return gate_oacc_kernels (fn); } + virtual unsigned int execute (function *fn) + { + /* Rather than having a copy of the previous dump, get some use out of + this dump, and try to minimize differences with the following pass + (pass_lim), which will initizalize the loop optimizer with + LOOPS_NORMAL. */ + loop_optimizer_init (LOOPS_NORMAL); + loop_optimizer_finalize (fn); + return 0; + } + +}; // class pass_oacc_kernels2 + +} // anon namespace + +gimple_opt_pass * +make_pass_oacc_kernels2 (gcc::context *ctxt) +{ + return new pass_oacc_kernels2 (ctxt); +} + /* The no-loop superpass. */ namespace { |