diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2022-11-09 10:58:15 -0500 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2022-11-11 10:07:50 -0500 |
commit | dab5d73959cfc8f03cba548777adda9a798e1f0e (patch) | |
tree | 236cc905e8c2c4036b40b8a3a36e85253676d42f /gcc/tree-vrp.cc | |
parent | ca1db2725a3232b2e15eaa1bd7fbe33927843476 (diff) | |
download | gcc-dab5d73959cfc8f03cba548777adda9a798e1f0e.zip gcc-dab5d73959cfc8f03cba548777adda9a798e1f0e.tar.gz gcc-dab5d73959cfc8f03cba548777adda9a798e1f0e.tar.bz2 |
process transitive inferred ranges in pre_fold_stmt.
The subst_and_fold engine can perform some folding activity before
calling fold_stmt, so do this work in pre_fold_stmt instead.
* tree-vrp.cc (rvrp_folder::rvrp_folder): Init m_last_bb_stmt.
(rvrp_folder::pre_fold_bb): Set m_last_bb_stmt.
(rvrp_folder::pre_fold_stmt): Check for transitive inferred ranges.
(rvrp_folder::fold_stmt): Check in pre_fold_stmt instead.
Diffstat (limited to 'gcc/tree-vrp.cc')
-rw-r--r-- | gcc/tree-vrp.cc | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index 3393c73..a474d9d 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -4442,6 +4442,7 @@ public: { m_ranger = r; m_pta = new pointer_equiv_analyzer (m_ranger); + m_last_bb_stmt = NULL; } ~rvrp_folder () @@ -4485,6 +4486,7 @@ public: for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) m_ranger->register_inferred_ranges (gsi.phi ()); + m_last_bb_stmt = last_stmt (bb); } void post_fold_bb (basic_block bb) override @@ -4497,19 +4499,14 @@ public: void pre_fold_stmt (gimple *stmt) override { m_pta->visit_stmt (stmt); + // If this is the last stmt and there are inferred ranges, reparse the + // block for transitive inferred ranges that occur earlier in the block. + if (stmt == m_last_bb_stmt) + m_ranger->register_transitive_inferred_ranges (gimple_bb (stmt)); } bool fold_stmt (gimple_stmt_iterator *gsi) override { - gimple *s = gsi_stmt (*gsi); - // If this is a block ending condition, and there are inferred ranges, - // reparse the block to see if there are any transitive inferred ranges. - if (is_a<gcond *> (s)) - { - basic_block bb = gimple_bb (s); - if (bb && s == gimple_outgoing_range_stmt_p (bb)) - m_ranger->register_transitive_inferred_ranges (bb); - } bool ret = m_simplifier.simplify (gsi); if (!ret) ret = m_ranger->fold_stmt (gsi, follow_single_use_edges); @@ -4523,6 +4520,7 @@ private: gimple_ranger *m_ranger; simplify_using_ranges m_simplifier; pointer_equiv_analyzer *m_pta; + gimple *m_last_bb_stmt; }; /* Main entry point for a VRP pass using just ranger. This can be called |