aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-05-14 17:05:56 +0200
committerAldy Hernandez <aldyh@redhat.com>2020-05-15 09:28:36 +0200
commit9e7dee08220922ed57af6c58d1c615512fa91687 (patch)
tree1cc16c1e052a88cc351b6e0a0a84947763edcb1f /gcc
parentec5047297e18a84d65914982401dc5f4a449d227 (diff)
downloadgcc-9e7dee08220922ed57af6c58d1c615512fa91687.zip
gcc-9e7dee08220922ed57af6c58d1c615512fa91687.tar.gz
gcc-9e7dee08220922ed57af6c58d1c615512fa91687.tar.bz2
Enabled evrp trapping when IL changes but only iff -frvrp1-changes is set.
Also, implement global -frvrp-changes that overrides the individual pass settings.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/common.opt7
-rw-r--r--gcc/gimple-ranger-vrp.cc2
-rw-r--r--gcc/gimple-ssa-evrp.c21
-rw-r--r--gcc/opts.c7
-rw-r--r--gcc/vr-values.c2
5 files changed, 35 insertions, 4 deletions
diff --git a/gcc/common.opt b/gcc/common.opt
index 471c5d2..5404145 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -2922,10 +2922,15 @@ fvect-cost-model
Common Alias(fvect-cost-model=,dynamic,unlimited)
Enables the dynamic vectorizer cost model. Preserved for backward compatibility.
-;; Allow RVRP passes to make IL changes.
+frvrp-changes
+Common Var(flag_rvrp_changes) Init(-1)
+Allow RVRP passes to make IL changes.
+
+;; Allow IL changes in rvrp1 pass.
frvrp1-changes
Common Var(flag_rvrp1_changes) Init(-1)
+;; Allow IL changes in rvrp2 pass.
frvrp2-changes
Common Var(flag_rvrp2_changes) Init(-1)
diff --git a/gcc/gimple-ranger-vrp.cc b/gcc/gimple-ranger-vrp.cc
index 5867d7a..e261d28 100644
--- a/gcc/gimple-ranger-vrp.cc
+++ b/gcc/gimple-ranger-vrp.cc
@@ -145,7 +145,7 @@ public:
{ return flag_tree_vrp != 0; }
virtual unsigned int execute (function *)
{
- // -frvrp*_changes flag overrides pass defaults.
+ // -frvrp[12]-changes 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)
diff --git a/gcc/gimple-ssa-evrp.c b/gcc/gimple-ssa-evrp.c
index 00555fc..c4b39d7 100644
--- a/gcc/gimple-ssa-evrp.c
+++ b/gcc/gimple-ssa-evrp.c
@@ -345,6 +345,20 @@ public:
range_analyzer.enter (bb);
}
+ void tmp_stats_remove_stmt (gimple *stmt, tree lhs) OVERRIDE
+ {
+ if (flag_rvrp1_changes > 0)
+ m_gimple_state.remove (stmt, lhs);
+ }
+
+ void tmp_stats_changed_phi (gphi *orig_phi, gphi *new_phi) OVERRIDE
+ {
+ gimple *save = m_gimple_state.save (orig_phi);
+ if (flag_rvrp1_changes > 0)
+ m_gimple_state.trap_if_gimple_changed (new_phi);
+ m_gimple_state.save (save);
+ }
+
void pre_fold_stmt (gimple *stmt)
{
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -352,12 +366,16 @@ public:
fprintf (dump_file, "Visiting stmt ");
print_gimple_stmt (dump_file, stmt, 0);
}
+ m_gimple_state.save (stmt);
range_analyzer.record_ranges_from_stmt (stmt, false);
}
bool fold_stmt (gimple_stmt_iterator *gsi)
{
- return simplifier.simplify (gsi);
+ bool res = simplifier.simplify (gsi);
+ if (flag_rvrp1_changes > 0)
+ m_gimple_state.trap_if_gimple_changed (gsi_stmt (*gsi));
+ return res;
}
void post_fold_bb (basic_block bb)
@@ -375,6 +393,7 @@ private:
class evrp_range_analyzer range_analyzer;
class vr_values *vr_values;
simplify_using_ranges simplifier;
+ class gimple_state m_gimple_state;
};
/* Main entry point for the early vrp pass which is a simplified non-iterative
diff --git a/gcc/opts.c b/gcc/opts.c
index d5efadb..cbd7de7 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -973,6 +973,13 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
opts->x_flag_reorder_blocks = 1;
}
+ // -frvrp-changes overrides the individual pass settings.
+ if (opts->x_flag_rvrp_changes != -1)
+ {
+ opts->x_flag_rvrp1_changes = opts->x_flag_rvrp_changes;
+ opts->x_flag_rvrp2_changes = opts->x_flag_rvrp_changes;
+ }
+
/* If user requested unwind info, then turn off the partitioning
optimization. */
diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index 13d5934..28911dc 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -4010,7 +4010,7 @@ simplify_conversion_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
// FIXME: This conversion has nothing to do with ranges, and the way
// it uses global ranges versus local ranges is interfering with our
// ability to diagnose differences between evrp and rvrp1.
- if (flag_rvrp1_changes)
+ if (flag_rvrp1_changes > 0)
return false;
/* Get the value-range of the inner operand. Use get_range_info in