diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-05-14 17:05:56 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-05-15 09:28:36 +0200 |
commit | 9e7dee08220922ed57af6c58d1c615512fa91687 (patch) | |
tree | 1cc16c1e052a88cc351b6e0a0a84947763edcb1f /gcc | |
parent | ec5047297e18a84d65914982401dc5f4a449d227 (diff) | |
download | gcc-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.opt | 7 | ||||
-rw-r--r-- | gcc/gimple-ranger-vrp.cc | 2 | ||||
-rw-r--r-- | gcc/gimple-ssa-evrp.c | 21 | ||||
-rw-r--r-- | gcc/opts.c | 7 | ||||
-rw-r--r-- | gcc/vr-values.c | 2 |
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 @@ -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 |