From b0c77505ddbc1ebdecb71042e824fa4e36ba59a3 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Mon, 16 Nov 2015 12:40:05 +0000 Subject: [PATCH] Remove first_pass_instance from pass_vrp 2015-11-16 Tom de Vries * gdbhooks.py (class PassNames): Handle extra arg NEXT_PASS argument. * gen-pass-instances.awk (handle_line): Same. * pass_manager.h (class pass_manager): Define and undefine NEXT_PASS_WITH_ARG. * passes.c (opt_pass::set_pass_param): New function. (pass_manager::pass_manager): Define and undefine NEXT_PASS_WITH_ARG. * passes.def: Add extra arg to NEXT_PASS (pass_vrp). * tree-pass.h (gimple_opt::set_pass_param): Declare. * tree-vrp.c (vrp_finalize, execute_vrp): Add and handle warn_array_bounds_p parameter. (pass_vrp::pass_vrp): Initialize warn_array_bounds_p. (pass_vrp::set_pass_param): New function. (pass_vrp::execute): Add warn_array_bounds_p arg to execute_vrp call. (pass_vrp::warn_array_bounds_p): New private member. From-SVN: r230415 --- gcc/ChangeLog | 17 +++++++++++++++++ gcc/gdbhooks.py | 2 +- gcc/gen-pass-instances.awk | 28 +++++++++++++++++++++++----- gcc/pass_manager.h | 2 ++ gcc/passes.c | 14 ++++++++++++++ gcc/passes.def | 4 ++-- gcc/tree-pass.h | 1 + gcc/tree-vrp.c | 20 ++++++++++++++------ 8 files changed, 74 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 889f434c049..e6e4fbee015 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2015-11-16 Tom de Vries + + * gdbhooks.py (class PassNames): Handle extra arg NEXT_PASS argument. + * gen-pass-instances.awk (handle_line): Same. + * pass_manager.h (class pass_manager): Define and undefine + NEXT_PASS_WITH_ARG. + * passes.c (opt_pass::set_pass_param): New function. + (pass_manager::pass_manager): Define and undefine NEXT_PASS_WITH_ARG. + * passes.def: Add extra arg to NEXT_PASS (pass_vrp). + * tree-pass.h (gimple_opt::set_pass_param): Declare. + * tree-vrp.c (vrp_finalize, execute_vrp): Add and handle + warn_array_bounds_p parameter. + (pass_vrp::pass_vrp): Initialize warn_array_bounds_p. + (pass_vrp::set_pass_param): New function. + (pass_vrp::execute): Add warn_array_bounds_p arg to execute_vrp call. + (pass_vrp::warn_array_bounds_p): New private member. + 2015-11-16 Eric Botcazou * config/sparc/sparc.c (sparc_emit_probe_stack_range): Adjust. diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py index 2b9a94ca9f7..f920392b17f 100644 --- a/gcc/gdbhooks.py +++ b/gcc/gdbhooks.py @@ -537,7 +537,7 @@ class PassNames: self.names = [] with open(os.path.join(srcdir, 'passes.def')) as f: for line in f: - m = re.match('\s*NEXT_PASS \((.+)\);', line) + m = re.match('\s*NEXT_PASS \(([^,]+).*\);', line) if m: self.names.append(m.group(1)) diff --git a/gcc/gen-pass-instances.awk b/gcc/gen-pass-instances.awk index 9cff4297388..106a2f69a9e 100644 --- a/gcc/gen-pass-instances.awk +++ b/gcc/gen-pass-instances.awk @@ -61,12 +61,14 @@ function handle_line() len_of_args = len_of_call - (len_of_start + len_of_close); args_start_at = call_starts_at + len_of_start; args_str = substr(line, args_start_at, len_of_args); + split(args_str, args, ","); - # Set pass_name argument - pass_name = args_str; + # Set pass_name argument, an optional with_arg argument + pass_name = args[1]; + with_arg = args[2]; - # Find call expression prefix (until and including called function) - len_of_prefix = args_start_at - 1 - len_of_open; + # Find call expression prefix + len_of_prefix = call_starts_at - 1; prefix = substr(line, 1, len_of_prefix); # Find call expression postfix @@ -82,7 +84,23 @@ function handle_line() pass_num = pass_counts[pass_name]; # Print call expression with extra pass_num argument - printf "%s(%s, %s)%s\n", prefix, pass_name, pass_num, postfix; + printf "%s", prefix; + if (with_arg) + { + printf "NEXT_PASS_WITH_ARG"; + } + else + { + printf "NEXT_PASS"; + } + printf " ("; + printf "%s", pass_name; + printf ", %s", pass_num; + if (with_arg) + { + printf ", %s", with_arg; + } + printf ")%s\n", postfix; } { handle_line() } diff --git a/gcc/pass_manager.h b/gcc/pass_manager.h index 7d539e47aa8..a8199e2f413 100644 --- a/gcc/pass_manager.h +++ b/gcc/pass_manager.h @@ -120,6 +120,7 @@ private: #define PUSH_INSERT_PASSES_WITHIN(PASS) #define POP_INSERT_PASSES() #define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM +#define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM) #define TERMINATE_PASS_LIST() #include "pass-instances.def" @@ -128,6 +129,7 @@ private: #undef PUSH_INSERT_PASSES_WITHIN #undef POP_INSERT_PASSES #undef NEXT_PASS +#undef NEXT_PASS_WITH_ARG #undef TERMINATE_PASS_LIST }; // class pass_manager diff --git a/gcc/passes.c b/gcc/passes.c index dd8d00ad36a..e634c5c7985 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -81,6 +81,13 @@ opt_pass::clone () internal_error ("pass %s does not support cloning", name); } +void +opt_pass::set_pass_param (unsigned int, bool) +{ + internal_error ("pass %s needs a set_pass_param implementation to handle the" + " extra argument in NEXT_PASS", name); +} + bool opt_pass::gate (function *) { @@ -1572,6 +1579,12 @@ pass_manager::pass_manager (context *ctxt) p = next_pass_1 (p, PASS ## _ ## NUM, PASS ## _1); \ } while (0) +#define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) \ + do { \ + NEXT_PASS (PASS, NUM); \ + PASS ## _ ## NUM->set_pass_param (0, ARG); \ + } while (0) + #define TERMINATE_PASS_LIST() \ *p = NULL; @@ -1581,6 +1594,7 @@ pass_manager::pass_manager (context *ctxt) #undef PUSH_INSERT_PASSES_WITHIN #undef POP_INSERT_PASSES #undef NEXT_PASS +#undef NEXT_PASS_WITH_ARG #undef TERMINATE_PASS_LIST /* Register the passes with the tree dump code. */ diff --git a/gcc/passes.def b/gcc/passes.def index db822d33597..64c1fa10915 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -171,7 +171,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_return_slot); NEXT_PASS (pass_fre); NEXT_PASS (pass_merge_phi); - NEXT_PASS (pass_vrp); + NEXT_PASS (pass_vrp, true /* warn_array_bounds_p */); NEXT_PASS (pass_chkp_opt); NEXT_PASS (pass_dce); NEXT_PASS (pass_stdarg); @@ -281,7 +281,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_tracer); NEXT_PASS (pass_dominator); NEXT_PASS (pass_strlen); - NEXT_PASS (pass_vrp); + NEXT_PASS (pass_vrp, false /* warn_array_bounds_p */); /* The only const/copy propagation opportunities left after DOM and VRP should be due to degenerate PHI nodes. So rather than run the full propagators, run a specialized pass which diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index da677617826..a672d528b03 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -83,6 +83,7 @@ public: The default implementation prints an error message and aborts. */ virtual opt_pass *clone (); + virtual void set_pass_param (unsigned int, bool); /* This pass and all sub-passes are executed only if the function returns true. The default implementation returns true. */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index e2393e4d3a0..5d085b42d45 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -10183,7 +10183,7 @@ finalize_jump_threads (void) /* Traverse all the blocks folding conditionals with known ranges. */ static void -vrp_finalize (void) +vrp_finalize (bool warn_array_bounds_p) { size_t i; @@ -10199,7 +10199,7 @@ vrp_finalize (void) substitute_and_fold (op_with_constant_singleton_value_range, vrp_fold_stmt, false); - if (warn_array_bounds && first_pass_instance) + if (warn_array_bounds && warn_array_bounds_p) check_all_array_refs (); /* We must identify jump threading opportunities before we release @@ -10289,7 +10289,7 @@ vrp_finalize (void) probabilities to aid branch prediction. */ static unsigned int -execute_vrp (void) +execute_vrp (bool warn_array_bounds_p) { int i; edge e; @@ -10313,7 +10313,7 @@ execute_vrp (void) vrp_initialize (); ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node); - vrp_finalize (); + vrp_finalize (warn_array_bounds_p); free_numbers_of_iterations_estimates (cfun); @@ -10386,14 +10386,22 @@ class pass_vrp : public gimple_opt_pass { public: pass_vrp (gcc::context *ctxt) - : gimple_opt_pass (pass_data_vrp, ctxt) + : gimple_opt_pass (pass_data_vrp, ctxt), warn_array_bounds_p (false) {} /* opt_pass methods: */ opt_pass * clone () { return new pass_vrp (m_ctxt); } + void set_pass_param (unsigned int n, bool param) + { + gcc_assert (n == 0); + warn_array_bounds_p = param; + } virtual bool gate (function *) { return flag_tree_vrp != 0; } - virtual unsigned int execute (function *) { return execute_vrp (); } + virtual unsigned int execute (function *) + { return execute_vrp (warn_array_bounds_p); } + private: + bool warn_array_bounds_p; }; // class pass_vrp } // anon namespace -- 2.30.2