+2015-11-16 Tom de Vries <tom@codesourcery.com>
+
+ * passes.def: Add arg to pass_dominator pass instantiation.
+ * tree-pass.h (first_pass_instance): Remove pass_dominator-related bit
+ of comment.
+ * tree-ssa-dom.c (pass_dominator::pass_dominator): Initialize
+ may_peel_loop_headers_p.
+ (pass_dominator::set_pass_param): New member function. Set
+ may_peel_loop_headers_p.
+ (pass_dominator::may_peel_loop_headers_p): New private member.
+ (pass_dominator::execute): Use may_peel_loop_headers_p instead of
+ first_pass_instance.
+
2015-11-16 Tom de Vries <tom@codesourcery.com>
* passes.def: Add arg to pass_reassoc pass instantiation.
propagations have already run, but before some more dead code
is removed, and this place fits nicely. Remember this when
trying to move or duplicate pass_dominator somewhere earlier. */
- NEXT_PASS (pass_dominator);
+ NEXT_PASS (pass_dominator, true /* may_peel_loop_headers_p */);
/* At this point the majority of const/copy propagations
are exposed. Go ahead and identify paths that should never
be executed in a conforming program and isolate those paths.
NEXT_PASS (pass_reassoc, false /* insert_powi_p */);
NEXT_PASS (pass_strength_reduction);
NEXT_PASS (pass_tracer);
- NEXT_PASS (pass_dominator);
+ NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */);
NEXT_PASS (pass_strlen);
NEXT_PASS (pass_vrp, false /* warn_array_bounds_p */);
/* The only const/copy propagation opportunities left after
/* Set to true if the pass is called the first time during compilation of the
current function. Note that using this information in the optimization
- passes is considered not to be clean, and it should be avoided if possible.
- This flag is currently used to prevent loops from being peeled repeatedly
- in jump threading; it will be removed once we preserve loop structures
- throughout the compilation -- we will be able to mark the affected loops
- directly in jump threading, and avoid peeling them next time. */
+ passes is considered not to be clean, and it should be avoided if
+ possible. */
extern bool first_pass_instance;
/* Declare for plugins. */
{
public:
pass_dominator (gcc::context *ctxt)
- : gimple_opt_pass (pass_data_dominator, ctxt)
+ : gimple_opt_pass (pass_data_dominator, ctxt),
+ may_peel_loop_headers_p (false)
{}
/* opt_pass methods: */
opt_pass * clone () { return new pass_dominator (m_ctxt); }
+ void set_pass_param (unsigned int n, bool param)
+ {
+ gcc_assert (n == 0);
+ may_peel_loop_headers_p = param;
+ }
virtual bool gate (function *) { return flag_tree_dom != 0; }
virtual unsigned int execute (function *);
+ private:
+ /* This flag is used to prevent loops from being peeled repeatedly in jump
+ threading; it will be removed once we preserve loop structures throughout
+ the compilation -- we will be able to mark the affected loops directly in
+ jump threading, and avoid peeling them next time. */
+ bool may_peel_loop_headers_p;
}; // class pass_dominator
unsigned int
free_all_edge_infos ();
/* Thread jumps, creating duplicate blocks as needed. */
- cfg_altered |= thread_through_all_blocks (first_pass_instance);
+ cfg_altered |= thread_through_all_blocks (may_peel_loop_headers_p);
if (cfg_altered)
free_dominance_info (CDI_DOMINATORS);