diff options
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 |