aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2022-11-09 10:58:15 -0500
committerAndrew MacLeod <amacleod@redhat.com>2022-11-11 10:07:50 -0500
commitdab5d73959cfc8f03cba548777adda9a798e1f0e (patch)
tree236cc905e8c2c4036b40b8a3a36e85253676d42f /gcc/tree-vrp.cc
parentca1db2725a3232b2e15eaa1bd7fbe33927843476 (diff)
downloadgcc-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.cc16
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