Run pass_expand_omp_ssa after pass_paralellize_loops
2014-11-13 Tom de Vries <tom@codesourcery.com> * omp-low.c (pass_data_expand_omp): Set properties_provided to PROP_gimple_eomp. (pass_expand_omp::gate): Remove function. Move gate expression to ... (pass_expand_omp::execute): ... here, as new variable gate. Add early exit if gate is false. (pass_data pass_data_expand_omp_ssa): New pass_data. (class pass_expand_omp_ssa): New pass. (make_pass_expand_omp_ssa): New function. * passes.def (pass_parallelize_loops): Use PUSH_INSERT_PASSES_WITHIN instead of NEXT_PASS. (pass_expand_omp_ssa): Add after pass_parallelize_loops. * tree-parloops.c (gen_parallel_loop): Remove call to omp_expand_local. (pass_parallelize_loops::execute): Don't do cleanups TODO_cleanup_cfg and TODO_rebuild_alias yet. Add TODO_update_ssa. Set cfun->omp_expand_needed. * tree-pass.h: Add define PROP_gimple_eomp. (make_pass_expand_omp_ssa): Declare. From-SVN: r217474
This commit is contained in:
parent
d82f1e1305
commit
187518942c
5 changed files with 82 additions and 17 deletions
|
@ -1,3 +1,23 @@
|
|||
2014-11-13 Tom de Vries <tom@codesourcery.com>
|
||||
|
||||
* omp-low.c (pass_data_expand_omp): Set properties_provided to
|
||||
PROP_gimple_eomp.
|
||||
(pass_expand_omp::gate): Remove function. Move gate expression to ...
|
||||
(pass_expand_omp::execute): ... here, as new variable gate. Add early
|
||||
exit if gate is false.
|
||||
(pass_data pass_data_expand_omp_ssa): New pass_data.
|
||||
(class pass_expand_omp_ssa): New pass.
|
||||
(make_pass_expand_omp_ssa): New function.
|
||||
* passes.def (pass_parallelize_loops): Use PUSH_INSERT_PASSES_WITHIN
|
||||
instead of NEXT_PASS.
|
||||
(pass_expand_omp_ssa): Add after pass_parallelize_loops.
|
||||
* tree-parloops.c (gen_parallel_loop): Remove call to omp_expand_local.
|
||||
(pass_parallelize_loops::execute): Don't do cleanups TODO_cleanup_cfg
|
||||
and TODO_rebuild_alias yet. Add TODO_update_ssa. Set
|
||||
cfun->omp_expand_needed.
|
||||
* tree-pass.h: Add define PROP_gimple_eomp.
|
||||
(make_pass_expand_omp_ssa): Declare.
|
||||
|
||||
2014-11-13 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
* tree.h (TYPE_OVERFLOW_SANITIZED): Define.
|
||||
|
|
|
@ -8801,7 +8801,7 @@ const pass_data pass_data_expand_omp =
|
|||
OPTGROUP_NONE, /* optinfo_flags */
|
||||
TV_NONE, /* tv_id */
|
||||
PROP_gimple_any, /* properties_required */
|
||||
0, /* properties_provided */
|
||||
PROP_gimple_eomp, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0, /* todo_flags_finish */
|
||||
|
@ -8815,13 +8815,18 @@ public:
|
|||
{}
|
||||
|
||||
/* opt_pass methods: */
|
||||
virtual bool gate (function *)
|
||||
virtual unsigned int execute (function *)
|
||||
{
|
||||
return ((flag_openmp != 0 || flag_openmp_simd != 0
|
||||
|| flag_cilkplus != 0) && !seen_error ());
|
||||
}
|
||||
bool gate = ((flag_openmp != 0 || flag_openmp_simd != 0
|
||||
|| flag_cilkplus != 0) && !seen_error ());
|
||||
|
||||
virtual unsigned int execute (function *) { return execute_expand_omp (); }
|
||||
/* This pass always runs, to provide PROP_gimple_eomp.
|
||||
But there is nothing to do unless -fopenmp is given. */
|
||||
if (!gate)
|
||||
return 0;
|
||||
|
||||
return execute_expand_omp ();
|
||||
}
|
||||
|
||||
}; // class pass_expand_omp
|
||||
|
||||
|
@ -8832,6 +8837,45 @@ make_pass_expand_omp (gcc::context *ctxt)
|
|||
{
|
||||
return new pass_expand_omp (ctxt);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
const pass_data pass_data_expand_omp_ssa =
|
||||
{
|
||||
GIMPLE_PASS, /* type */
|
||||
"ompexpssa", /* name */
|
||||
OPTGROUP_NONE, /* optinfo_flags */
|
||||
TV_NONE, /* tv_id */
|
||||
PROP_cfg | PROP_ssa, /* properties_required */
|
||||
PROP_gimple_eomp, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_cleanup_cfg | TODO_rebuild_alias, /* todo_flags_finish */
|
||||
};
|
||||
|
||||
class pass_expand_omp_ssa : public gimple_opt_pass
|
||||
{
|
||||
public:
|
||||
pass_expand_omp_ssa (gcc::context *ctxt)
|
||||
: gimple_opt_pass (pass_data_expand_omp_ssa, ctxt)
|
||||
{}
|
||||
|
||||
/* opt_pass methods: */
|
||||
virtual bool gate (function *fun)
|
||||
{
|
||||
return !(fun->curr_properties & PROP_gimple_eomp);
|
||||
}
|
||||
virtual unsigned int execute (function *) { return execute_expand_omp (); }
|
||||
|
||||
}; // class pass_expand_omp_ssa
|
||||
|
||||
} // anon namespace
|
||||
|
||||
gimple_opt_pass *
|
||||
make_pass_expand_omp_ssa (gcc::context *ctxt)
|
||||
{
|
||||
return new pass_expand_omp_ssa (ctxt);
|
||||
}
|
||||
|
||||
/* Routines to lower OpenMP directives into OMP-GIMPLE. */
|
||||
|
||||
|
|
|
@ -241,6 +241,9 @@ along with GCC; see the file COPYING3. If not see
|
|||
POP_INSERT_PASSES ()
|
||||
NEXT_PASS (pass_iv_canon);
|
||||
NEXT_PASS (pass_parallelize_loops);
|
||||
PUSH_INSERT_PASSES_WITHIN (pass_parallelize_loops)
|
||||
NEXT_PASS (pass_expand_omp_ssa);
|
||||
POP_INSERT_PASSES ()
|
||||
NEXT_PASS (pass_if_conversion);
|
||||
/* pass_vectorize must immediately follow pass_if_conversion.
|
||||
Please do not add any other passes in between. */
|
||||
|
|
|
@ -1753,7 +1753,6 @@ gen_parallel_loop (struct loop *loop,
|
|||
tree many_iterations_cond, type, nit;
|
||||
tree arg_struct, new_arg_struct;
|
||||
gimple_seq stmts;
|
||||
basic_block parallel_head;
|
||||
edge entry, exit;
|
||||
struct clsn_data clsn_data;
|
||||
unsigned prob;
|
||||
|
@ -1891,8 +1890,8 @@ gen_parallel_loop (struct loop *loop,
|
|||
cond_stmt = last_stmt (loop->header);
|
||||
if (cond_stmt)
|
||||
loc = gimple_location (cond_stmt);
|
||||
parallel_head = create_parallel_loop (loop, create_loop_fn (loc), arg_struct,
|
||||
new_arg_struct, n_threads, loc);
|
||||
create_parallel_loop (loop, create_loop_fn (loc), arg_struct,
|
||||
new_arg_struct, n_threads, loc);
|
||||
if (reduction_list->elements () > 0)
|
||||
create_call_for_reduction (loop, reduction_list, &clsn_data);
|
||||
|
||||
|
@ -1906,13 +1905,6 @@ gen_parallel_loop (struct loop *loop,
|
|||
removed statements. */
|
||||
FOR_EACH_LOOP (loop, 0)
|
||||
free_numbers_of_iterations_estimates_loop (loop);
|
||||
|
||||
/* Expand the parallel constructs. We do it directly here instead of running
|
||||
a separate expand_omp pass, since it is more efficient, and less likely to
|
||||
cause troubles with further analyses not being able to deal with the
|
||||
OMP trees. */
|
||||
|
||||
omp_expand_local (parallel_head);
|
||||
}
|
||||
|
||||
/* Returns true when LOOP contains vector phi nodes. */
|
||||
|
@ -2284,7 +2276,11 @@ pass_parallelize_loops::execute (function *fun)
|
|||
return 0;
|
||||
|
||||
if (parallelize_loops ())
|
||||
return TODO_cleanup_cfg | TODO_rebuild_alias;
|
||||
{
|
||||
fun->curr_properties &= ~(PROP_gimple_eomp);
|
||||
return TODO_update_ssa;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -220,6 +220,7 @@ protected:
|
|||
#define PROP_gimple_lcx (1 << 10) /* lowered complex */
|
||||
#define PROP_loops (1 << 11) /* preserve loop structures */
|
||||
#define PROP_gimple_lvec (1 << 12) /* lowered vector */
|
||||
#define PROP_gimple_eomp (1 << 13) /* no OpenMP directives */
|
||||
|
||||
#define PROP_trees \
|
||||
(PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
|
||||
|
@ -399,6 +400,7 @@ extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
|
|||
extern gimple_opt_pass *make_pass_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_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);
|
||||
|
|
Loading…
Add table
Reference in a new issue