aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-04-29 08:25:29 +0200
committerAldy Hernandez <aldyh@redhat.com>2020-04-29 16:56:33 +0200
commit7f0cbb5e5cf16745db2edd24e017b8dc987919f4 (patch)
treea2de4a73eb5f256b67128dbe9347304fc2a7bc08
parentd01bb094e052cd089ee50aeb036e593598c4de99 (diff)
downloadgcc-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.opt9
-rw-r--r--gcc/gimple-ranger-vrp.cc35
-rw-r--r--gcc/passes.def3
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);