diff options
Diffstat (limited to 'gcc/tree-ssa-loop.c')
-rw-r--r-- | gcc/tree-ssa-loop.c | 973 |
1 files changed, 645 insertions, 328 deletions
diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index 99e27a1359a..717f54ee932 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -41,26 +41,43 @@ gate_tree_loop (void) return flag_tree_loop_optimize != 0; } -struct gimple_opt_pass pass_tree_loop = -{ - { - GIMPLE_PASS, - "loop", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_loop, /* gate */ - NULL, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_LOOP, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_verify_ssa /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_tree_loop = +{ + GIMPLE_PASS, /* type */ + "loop", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + false, /* has_execute */ + TV_TREE_LOOP, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_verify_ssa, /* todo_flags_finish */ }; +class pass_tree_loop : public gimple_opt_pass +{ +public: + pass_tree_loop(gcc::context *ctxt) + : gimple_opt_pass(pass_data_tree_loop, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_loop (); } + +}; // class pass_tree_loop + +} // anon namespace + +gimple_opt_pass * +make_pass_tree_loop (gcc::context *ctxt) +{ + return new pass_tree_loop (ctxt); +} + /* Loop optimizer initialization. */ static unsigned int @@ -80,26 +97,43 @@ tree_ssa_loop_init (void) return 0; } -struct gimple_opt_pass pass_tree_loop_init = -{ - { - GIMPLE_PASS, - "loopinit", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - NULL, /* gate */ - tree_ssa_loop_init, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_NONE, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_tree_loop_init = +{ + GIMPLE_PASS, /* type */ + "loopinit", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + false, /* has_gate */ + true, /* has_execute */ + TV_NONE, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_tree_loop_init : public gimple_opt_pass +{ +public: + pass_tree_loop_init(gcc::context *ctxt) + : gimple_opt_pass(pass_data_tree_loop_init, ctxt) + {} + + /* opt_pass methods: */ + unsigned int execute () { return tree_ssa_loop_init (); } + +}; // class pass_tree_loop_init + +} // anon namespace + +gimple_opt_pass * +make_pass_tree_loop_init (gcc::context *ctxt) +{ + return new pass_tree_loop_init (ctxt); +} + /* Loop invariant motion pass. */ static unsigned int @@ -117,26 +151,45 @@ gate_tree_ssa_loop_im (void) return flag_tree_loop_im != 0; } -struct gimple_opt_pass pass_lim = -{ - { - GIMPLE_PASS, - "lim", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_ssa_loop_im, /* gate */ - tree_ssa_loop_im, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_LIM, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_lim = +{ + GIMPLE_PASS, /* type */ + "lim", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_LIM, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_lim : public gimple_opt_pass +{ +public: + pass_lim(gcc::context *ctxt) + : gimple_opt_pass(pass_data_lim, ctxt) + {} + + /* opt_pass methods: */ + opt_pass * clone () { return new pass_lim (ctxt_); } + bool gate () { return gate_tree_ssa_loop_im (); } + unsigned int execute () { return tree_ssa_loop_im (); } + +}; // class pass_lim + +} // anon namespace + +gimple_opt_pass * +make_pass_lim (gcc::context *ctxt) +{ + return new pass_lim (ctxt); +} + /* Loop unswitching pass. */ static unsigned int @@ -154,26 +207,44 @@ gate_tree_ssa_loop_unswitch (void) return flag_unswitch_loops != 0; } -struct gimple_opt_pass pass_tree_unswitch = -{ - { - GIMPLE_PASS, - "unswitch", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_ssa_loop_unswitch, /* gate */ - tree_ssa_loop_unswitch, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_LOOP_UNSWITCH, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_tree_unswitch = +{ + GIMPLE_PASS, /* type */ + "unswitch", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_TREE_LOOP_UNSWITCH, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_tree_unswitch : public gimple_opt_pass +{ +public: + pass_tree_unswitch(gcc::context *ctxt) + : gimple_opt_pass(pass_data_tree_unswitch, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_ssa_loop_unswitch (); } + unsigned int execute () { return tree_ssa_loop_unswitch (); } + +}; // class pass_tree_unswitch + +} // anon namespace + +gimple_opt_pass * +make_pass_tree_unswitch (gcc::context *ctxt) +{ + return new pass_tree_unswitch (ctxt); +} + /* Predictive commoning. */ static unsigned @@ -191,26 +262,44 @@ gate_tree_predictive_commoning (void) return flag_predictive_commoning != 0; } -struct gimple_opt_pass pass_predcom = -{ - { - GIMPLE_PASS, - "pcom", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_predictive_commoning, /* gate */ - run_tree_predictive_commoning, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_PREDCOM, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_update_ssa_only_virtuals /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_predcom = +{ + GIMPLE_PASS, /* type */ + "pcom", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_PREDCOM, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_update_ssa_only_virtuals, /* todo_flags_finish */ }; +class pass_predcom : public gimple_opt_pass +{ +public: + pass_predcom(gcc::context *ctxt) + : gimple_opt_pass(pass_data_predcom, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_predictive_commoning (); } + unsigned int execute () { return run_tree_predictive_commoning (); } + +}; // class pass_predcom + +} // anon namespace + +gimple_opt_pass * +make_pass_predcom (gcc::context *ctxt) +{ + return new pass_predcom (ctxt); +} + /* Loop autovectorization. */ static unsigned int @@ -228,27 +317,44 @@ gate_tree_vectorize (void) return flag_tree_vectorize; } -struct gimple_opt_pass pass_vectorize = -{ - { - GIMPLE_PASS, - "vect", /* name */ - OPTGROUP_LOOP - | OPTGROUP_VEC, /* optinfo_flags */ - gate_tree_vectorize, /* gate */ - tree_vectorize, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_VECTORIZATION, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_vectorize = +{ + GIMPLE_PASS, /* type */ + "vect", /* name */ + OPTGROUP_LOOP | OPTGROUP_VEC, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_TREE_VECTORIZATION, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_vectorize : public gimple_opt_pass +{ +public: + pass_vectorize(gcc::context *ctxt) + : gimple_opt_pass(pass_data_vectorize, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_vectorize (); } + unsigned int execute () { return tree_vectorize (); } + +}; // class pass_vectorize + +} // anon namespace + +gimple_opt_pass * +make_pass_vectorize (gcc::context *ctxt) +{ + return new pass_vectorize (ctxt); +} + /* GRAPHITE optimizations. */ static unsigned int @@ -278,46 +384,81 @@ gate_graphite_transforms (void) return flag_graphite != 0; } -struct gimple_opt_pass pass_graphite = -{ - { - GIMPLE_PASS, - "graphite0", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_graphite_transforms, /* gate */ - NULL, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_GRAPHITE, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_graphite = +{ + GIMPLE_PASS, /* type */ + "graphite0", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + false, /* has_execute */ + TV_GRAPHITE, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; -struct gimple_opt_pass pass_graphite_transforms = -{ - { - GIMPLE_PASS, - "graphite", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_graphite_transforms, /* gate */ - graphite_transforms, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_GRAPHITE_TRANSFORMS, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +class pass_graphite : public gimple_opt_pass +{ +public: + pass_graphite(gcc::context *ctxt) + : gimple_opt_pass(pass_data_graphite, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_graphite_transforms (); } + +}; // class pass_graphite + +} // anon namespace + +gimple_opt_pass * +make_pass_graphite (gcc::context *ctxt) +{ + return new pass_graphite (ctxt); +} + +namespace { + +const pass_data pass_data_graphite_transforms = +{ + GIMPLE_PASS, /* type */ + "graphite", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_GRAPHITE_TRANSFORMS, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_graphite_transforms : public gimple_opt_pass +{ +public: + pass_graphite_transforms(gcc::context *ctxt) + : gimple_opt_pass(pass_data_graphite_transforms, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_graphite_transforms (); } + unsigned int execute () { return graphite_transforms (); } + +}; // class pass_graphite_transforms + +} // anon namespace + +gimple_opt_pass * +make_pass_graphite_transforms (gcc::context *ctxt) +{ + return new pass_graphite_transforms (ctxt); +} + /* Check the correctness of the data dependence analyzers. */ static unsigned int @@ -336,26 +477,44 @@ gate_check_data_deps (void) return flag_check_data_deps != 0; } -struct gimple_opt_pass pass_check_data_deps = -{ - { - GIMPLE_PASS, - "ckdd", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_check_data_deps, /* gate */ - check_data_deps, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_CHECK_DATA_DEPS, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_check_data_deps = +{ + GIMPLE_PASS, /* type */ + "ckdd", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_CHECK_DATA_DEPS, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_check_data_deps : public gimple_opt_pass +{ +public: + pass_check_data_deps(gcc::context *ctxt) + : gimple_opt_pass(pass_data_check_data_deps, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_check_data_deps (); } + unsigned int execute () { return check_data_deps (); } + +}; // class pass_check_data_deps + +} // anon namespace + +gimple_opt_pass * +make_pass_check_data_deps (gcc::context *ctxt) +{ + return new pass_check_data_deps (ctxt); +} + /* Canonical induction variable creation pass. */ static unsigned int @@ -373,26 +532,44 @@ gate_tree_ssa_loop_ivcanon (void) return flag_tree_loop_ivcanon != 0; } -struct gimple_opt_pass pass_iv_canon = -{ - { - GIMPLE_PASS, - "ivcanon", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_ssa_loop_ivcanon, /* gate */ - tree_ssa_loop_ivcanon, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_LOOP_IVCANON, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_iv_canon = +{ + GIMPLE_PASS, /* type */ + "ivcanon", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_TREE_LOOP_IVCANON, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_iv_canon : public gimple_opt_pass +{ +public: + pass_iv_canon(gcc::context *ctxt) + : gimple_opt_pass(pass_data_iv_canon, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_ssa_loop_ivcanon (); } + unsigned int execute () { return tree_ssa_loop_ivcanon (); } + +}; // class pass_iv_canon + +} // anon namespace + +gimple_opt_pass * +make_pass_iv_canon (gcc::context *ctxt) +{ + return new pass_iv_canon (ctxt); +} + /* Propagation of constants using scev. */ static bool @@ -401,28 +578,45 @@ gate_scev_const_prop (void) return flag_tree_scev_cprop; } -struct gimple_opt_pass pass_scev_cprop = -{ - { - GIMPLE_PASS, - "sccp", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_scev_const_prop, /* gate */ - scev_const_prop, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_SCEV_CONST, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_cleanup_cfg - | TODO_update_ssa_only_virtuals - /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_scev_cprop = +{ + GIMPLE_PASS, /* type */ + "sccp", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_SCEV_CONST, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + ( TODO_cleanup_cfg + | TODO_update_ssa_only_virtuals ), /* todo_flags_finish */ }; +class pass_scev_cprop : public gimple_opt_pass +{ +public: + pass_scev_cprop(gcc::context *ctxt) + : gimple_opt_pass(pass_data_scev_cprop, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_scev_const_prop (); } + unsigned int execute () { return scev_const_prop (); } + +}; // class pass_scev_cprop + +} // anon namespace + +gimple_opt_pass * +make_pass_scev_cprop (gcc::context *ctxt) +{ + return new pass_scev_cprop (ctxt); +} + /* Record bounds on numbers of iterations of loops. */ static unsigned int @@ -436,26 +630,43 @@ tree_ssa_loop_bounds (void) return 0; } -struct gimple_opt_pass pass_record_bounds = -{ - { - GIMPLE_PASS, - "*record_bounds", /* name */ - OPTGROUP_NONE, /* optinfo_flags */ - NULL, /* gate */ - tree_ssa_loop_bounds, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_LOOP_BOUNDS, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_record_bounds = +{ + GIMPLE_PASS, /* type */ + "*record_bounds", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + false, /* has_gate */ + true, /* has_execute */ + TV_TREE_LOOP_BOUNDS, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_record_bounds : public gimple_opt_pass +{ +public: + pass_record_bounds(gcc::context *ctxt) + : gimple_opt_pass(pass_data_record_bounds, ctxt) + {} + + /* opt_pass methods: */ + unsigned int execute () { return tree_ssa_loop_bounds (); } + +}; // class pass_record_bounds + +} // anon namespace + +gimple_opt_pass * +make_pass_record_bounds (gcc::context *ctxt) +{ + return new pass_record_bounds (ctxt); +} + /* Complete unrolling of loops. */ static unsigned int @@ -475,26 +686,44 @@ gate_tree_complete_unroll (void) return true; } -struct gimple_opt_pass pass_complete_unroll = -{ - { - GIMPLE_PASS, - "cunroll", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_complete_unroll, /* gate */ - tree_complete_unroll, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_COMPLETE_UNROLL, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_complete_unroll = +{ + GIMPLE_PASS, /* type */ + "cunroll", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_COMPLETE_UNROLL, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_complete_unroll : public gimple_opt_pass +{ +public: + pass_complete_unroll(gcc::context *ctxt) + : gimple_opt_pass(pass_data_complete_unroll, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_complete_unroll (); } + unsigned int execute () { return tree_complete_unroll (); } + +}; // class pass_complete_unroll + +} // anon namespace + +gimple_opt_pass * +make_pass_complete_unroll (gcc::context *ctxt) +{ + return new pass_complete_unroll (ctxt); +} + /* Complete unrolling of inner loops. */ static unsigned int @@ -522,26 +751,44 @@ gate_tree_complete_unroll_inner (void) return optimize >= 2; } -struct gimple_opt_pass pass_complete_unrolli = -{ - { - GIMPLE_PASS, - "cunrolli", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_complete_unroll_inner, /* gate */ - tree_complete_unroll_inner, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_COMPLETE_UNROLL, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_verify_flow /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_complete_unrolli = +{ + GIMPLE_PASS, /* type */ + "cunrolli", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_COMPLETE_UNROLL, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_verify_flow, /* todo_flags_finish */ }; +class pass_complete_unrolli : public gimple_opt_pass +{ +public: + pass_complete_unrolli(gcc::context *ctxt) + : gimple_opt_pass(pass_data_complete_unrolli, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_complete_unroll_inner (); } + unsigned int execute () { return tree_complete_unroll_inner (); } + +}; // class pass_complete_unrolli + +} // anon namespace + +gimple_opt_pass * +make_pass_complete_unrolli (gcc::context *ctxt) +{ + return new pass_complete_unrolli (ctxt); +} + /* Parallelization. */ static bool @@ -561,26 +808,44 @@ tree_parallelize_loops (void) return 0; } -struct gimple_opt_pass pass_parallelize_loops = -{ - { - GIMPLE_PASS, - "parloops", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_parallelize_loops, /* gate */ - tree_parallelize_loops, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_PARALLELIZE_LOOPS, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_verify_flow /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_parallelize_loops = +{ + GIMPLE_PASS, /* type */ + "parloops", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_TREE_PARALLELIZE_LOOPS, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_verify_flow, /* todo_flags_finish */ }; +class pass_parallelize_loops : public gimple_opt_pass +{ +public: + pass_parallelize_loops(gcc::context *ctxt) + : gimple_opt_pass(pass_data_parallelize_loops, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_parallelize_loops (); } + unsigned int execute () { return tree_parallelize_loops (); } + +}; // class pass_parallelize_loops + +} // anon namespace + +gimple_opt_pass * +make_pass_parallelize_loops (gcc::context *ctxt) +{ + return new pass_parallelize_loops (ctxt); +} + /* Prefetching. */ static unsigned int @@ -598,26 +863,44 @@ gate_tree_ssa_loop_prefetch (void) return flag_prefetch_loop_arrays > 0; } -struct gimple_opt_pass pass_loop_prefetch = -{ - { - GIMPLE_PASS, - "aprefetch", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_ssa_loop_prefetch, /* gate */ - tree_ssa_loop_prefetch, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_PREFETCH, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0 /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_loop_prefetch = +{ + GIMPLE_PASS, /* type */ + "aprefetch", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_TREE_PREFETCH, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ }; +class pass_loop_prefetch : public gimple_opt_pass +{ +public: + pass_loop_prefetch(gcc::context *ctxt) + : gimple_opt_pass(pass_data_loop_prefetch, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_ssa_loop_prefetch (); } + unsigned int execute () { return tree_ssa_loop_prefetch (); } + +}; // class pass_loop_prefetch + +} // anon namespace + +gimple_opt_pass * +make_pass_loop_prefetch (gcc::context *ctxt) +{ + return new pass_loop_prefetch (ctxt); +} + /* Induction variable optimizations. */ static unsigned int @@ -636,26 +919,44 @@ gate_tree_ssa_loop_ivopts (void) return flag_ivopts != 0; } -struct gimple_opt_pass pass_iv_optimize = -{ - { - GIMPLE_PASS, - "ivopts", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - gate_tree_ssa_loop_ivopts, /* gate */ - tree_ssa_loop_ivopts, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_TREE_LOOP_IVOPTS, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_update_ssa /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_iv_optimize = +{ + GIMPLE_PASS, /* type */ + "ivopts", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_TREE_LOOP_IVOPTS, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_update_ssa, /* todo_flags_finish */ }; +class pass_iv_optimize : public gimple_opt_pass +{ +public: + pass_iv_optimize(gcc::context *ctxt) + : gimple_opt_pass(pass_data_iv_optimize, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_ssa_loop_ivopts (); } + unsigned int execute () { return tree_ssa_loop_ivopts (); } + +}; // class pass_iv_optimize + +} // anon namespace + +gimple_opt_pass * +make_pass_iv_optimize (gcc::context *ctxt) +{ + return new pass_iv_optimize (ctxt); +} + /* Loop optimizer finalization. */ static unsigned int @@ -667,23 +968,39 @@ tree_ssa_loop_done (void) return 0; } -struct gimple_opt_pass pass_tree_loop_done = -{ - { - GIMPLE_PASS, - "loopdone", /* name */ - OPTGROUP_LOOP, /* optinfo_flags */ - NULL, /* gate */ - tree_ssa_loop_done, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_NONE, /* tv_id */ - PROP_cfg, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_cleanup_cfg - | TODO_verify_flow /* todo_flags_finish */ - } +namespace { + +const pass_data pass_data_tree_loop_done = +{ + GIMPLE_PASS, /* type */ + "loopdone", /* name */ + OPTGROUP_LOOP, /* optinfo_flags */ + false, /* has_gate */ + true, /* has_execute */ + TV_NONE, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + ( TODO_cleanup_cfg | TODO_verify_flow ), /* todo_flags_finish */ }; + +class pass_tree_loop_done : public gimple_opt_pass +{ +public: + pass_tree_loop_done(gcc::context *ctxt) + : gimple_opt_pass(pass_data_tree_loop_done, ctxt) + {} + + /* opt_pass methods: */ + unsigned int execute () { return tree_ssa_loop_done (); } + +}; // class pass_tree_loop_done + +} // anon namespace + +gimple_opt_pass * +make_pass_tree_loop_done (gcc::context *ctxt) +{ + return new pass_tree_loop_done (ctxt); +} |