diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-04-29 08:25:29 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-04-29 16:56:33 +0200 |
commit | 7f0cbb5e5cf16745db2edd24e017b8dc987919f4 (patch) | |
tree | a2de4a73eb5f256b67128dbe9347304fc2a7bc08 | |
parent | d01bb094e052cd089ee50aeb036e593598c4de99 (diff) | |
download | gcc-7f0cbb5e5cf16745db2edd24e017b8dc987919f4.zip gcc-7f0cbb5e5cf16745db2edd24e017b8dc987919f4.tar.gz gcc-7f0cbb5e5cf16745db2edd24e017b8dc987919f4.tar.bz2 |
Run two RVRP passes before and after EVRP.
RVRP1 runs before EVRP.
RVRP2 runs after EVRP.
RVRP1 has IL changes OFF by default.
RVRP2 has IL changes ON by default.
IL changes are enabled/disabled with these flags:
-frvrp1-changes vs -fno-rvrp1-changes
-frvrp2-changes vs -fno-rvrp2-changes
GORI dumps are disabled by default and can be enabled with:
-fdump-tree-all-details-gori
-rw-r--r-- | gcc/common.opt | 9 | ||||
-rw-r--r-- | gcc/gimple-ranger-vrp.cc | 35 | ||||
-rw-r--r-- | gcc/passes.def | 3 |
3 files changed, 36 insertions, 11 deletions
diff --git a/gcc/common.opt b/gcc/common.opt index 35e7ab3..471c5d2 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2922,9 +2922,12 @@ fvect-cost-model Common Alias(fvect-cost-model=,dynamic,unlimited) Enables the dynamic vectorizer cost model. Preserved for backward compatibility. -;; Allow RVRP to make IL changes. -frvrp-changes -Common Var(flag_rvrp_changes) Init(0) +;; Allow RVRP passes to make IL changes. +frvrp1-changes +Common Var(flag_rvrp1_changes) Init(-1) + +frvrp2-changes +Common Var(flag_rvrp2_changes) Init(-1) ftree-vect-loop-version Common Ignore diff --git a/gcc/gimple-ranger-vrp.cc b/gcc/gimple-ranger-vrp.cc index 411dcac..34f558b 100644 --- a/gcc/gimple-ranger-vrp.cc +++ b/gcc/gimple-ranger-vrp.cc @@ -70,7 +70,8 @@ private: class rvrp_folder : public substitute_and_fold_engine { public: - rvrp_folder () : simplifier (&ranger) { } + rvrp_folder (bool allow_il_changes) + : simplifier (&ranger), allow_il_changes (allow_il_changes) { } tree get_value (tree op, gimple *stmt) { @@ -94,23 +95,24 @@ public: bool disable_il_changes_p () { - return !flag_rvrp_changes; + return !allow_il_changes; } private: rvrp_ranger ranger; simplify_using_ranges simplifier; + bool allow_il_changes; }; static unsigned int -execute_ranger_vrp () +execute_ranger_vrp (bool allow_il_changes) { loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS); rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa); scev_initialize (); calculate_dominance_info (CDI_DOMINATORS); - rvrp_folder folder; + rvrp_folder folder (allow_il_changes); folder.substitute_and_fold (); scev_finalize (); @@ -138,12 +140,31 @@ class pass_ranger_vrp : public gimple_opt_pass public: pass_ranger_vrp (gcc::context *ctxt) : gimple_opt_pass (pass_data_ranger_vrp, ctxt) - {} - opt_pass * clone () { return new pass_ranger_vrp (m_ctxt); } + { + static int pass = 1; + rvrp_pass_num = pass; + pass++; + } + opt_pass *clone () { return new pass_ranger_vrp (m_ctxt); } + void set_pass_param (unsigned int n ATTRIBUTE_UNUSED, bool param) + { + allow_il_changes = param; + } virtual bool gate (function *) { return flag_tree_vrp != 0; } virtual unsigned int execute (function *) - { return execute_ranger_vrp (); } + { + // -frvrp*_changes flag overrides pass defaults. + if (rvrp_pass_num == 1 && flag_rvrp1_changes != -1) + allow_il_changes = flag_rvrp1_changes; + if (rvrp_pass_num == 2 && flag_rvrp2_changes != -1) + allow_il_changes = flag_rvrp2_changes; + + return execute_ranger_vrp (allow_il_changes); + } +private: + bool allow_il_changes; + int rvrp_pass_num; }; } // anon namespace diff --git a/gcc/passes.def b/gcc/passes.def index 2ec4dfb..d6ed6e4 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -84,8 +84,9 @@ along with GCC; see the file COPYING3. If not see execute TODO_rebuild_alias at this point. */ NEXT_PASS (pass_build_ealias); NEXT_PASS (pass_fre, true /* may_iterate */); - NEXT_PASS (pass_ranger_vrp); + NEXT_PASS (pass_ranger_vrp, false /* allow_il_changes */); NEXT_PASS (pass_early_vrp); + NEXT_PASS (pass_ranger_vrp, true /* allow_il_changes */); NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_dse); NEXT_PASS (pass_cd_dce); |