]> gcc.gnu.org Git - gcc.git/commitdiff
process transitive inferred ranges in pre_fold_stmt.
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 9 Nov 2022 15:58:15 +0000 (10:58 -0500)
committerAndrew MacLeod <amacleod@redhat.com>
Fri, 11 Nov 2022 15:07:50 +0000 (10:07 -0500)
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.

gcc/tree-vrp.cc

index 3393c73a7db729e6e51de8a2fde4873f03ebc2ae..a474d9d11e5cbeaf7743c58a72b928a739b9c044 100644 (file)
@@ -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
This page took 0.067938 seconds and 5 git commands to generate.