[gcc/devel/ranger] Implement loop_ranger::range_of_stmt to use SCEV when evaluating PHI's.

Aldy Hernandez aldyh@gcc.gnu.org
Tue Jun 9 18:20:19 GMT 2020


https://gcc.gnu.org/g:2f28c16f0d0be8bbf75cee0363bdbe1718c2c538

commit 2f28c16f0d0be8bbf75cee0363bdbe1718c2c538
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Tue Jun 9 12:32:00 2020 +0200

    Implement loop_ranger::range_of_stmt to use SCEV when evaluating PHI's.

Diff:
---
 gcc/gimple-ranger.cc                      | 22 ++++++++++++++++++++++
 gcc/gimple-ranger.h                       |  3 ++-
 gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c |  4 ++++
 gcc/testsuite/gcc.dg/tree-ssa/pr21458.c   |  6 +++++-
 4 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/gcc/gimple-ranger.cc b/gcc/gimple-ranger.cc
index edc996f8e05..22853a95c91 100644
--- a/gcc/gimple-ranger.cc
+++ b/gcc/gimple-ranger.cc
@@ -791,6 +791,28 @@ loop_ranger::range_of_phi (irange &r, gphi *phi)
   return range_with_loop_info (r, PHI_RESULT (phi));
 }
 
+bool
+loop_ranger::range_of_stmt (irange &r, gimple *stmt, tree name)
+{
+  // If there is no global range for a PHI, start the party with
+  // whatever information SCEV may have.
+  if (gphi *phi = dyn_cast<gphi *> (stmt))
+    {
+      tree phi_result = PHI_RESULT (phi);
+      if (!POINTER_TYPE_P (TREE_TYPE (phi_result))
+	  && !m_globals.get_global_range (r, phi_result)
+	  && range_with_loop_info (r, phi_result))
+	{
+	  value_range loop_range;
+	  get_range_info (phi_result, loop_range);
+	  r.intersect (loop_range);
+	  if (!r.varying_p ())
+	    set_range_info (phi_result, r);
+	}
+    }
+  return super::range_of_stmt (r, stmt, name);
+}
+
 void
 loop_ranger::range_on_edge (irange &r, edge e, tree name)
 {
diff --git a/gcc/gimple-ranger.h b/gcc/gimple-ranger.h
index f3f5eb6e0e1..f9b7cffad45 100644
--- a/gcc/gimple-ranger.h
+++ b/gcc/gimple-ranger.h
@@ -57,6 +57,7 @@ public:
 protected:
   virtual void range_of_ssa_name (irange &r, tree name, gimple *s = NULL);
   bool range_from_import (irange &r, tree name, irange &import_range);
+  ssa_global_cache m_globals;
 private:
   typedef gimple_ranger super;
   bool non_null_deref_p (tree name, basic_block bb);
@@ -68,7 +69,6 @@ private:
   void fill_block_cache (tree name, basic_block bb, basic_block def_bb);
   void iterative_cache_update (tree name);
 
-  ssa_global_cache m_globals;
   block_range_cache m_on_entry;
   non_null_ref m_non_null;
   vec<basic_block> m_workback;
@@ -85,6 +85,7 @@ public:
   ~loop_ranger ();
   virtual void range_on_edge (irange &r, edge e, tree name);
   virtual bool range_of_phi (irange &r, gphi *phi);
+  virtual bool range_of_stmt (irange &r, gimple *stmt, tree name);
 
 private:
   typedef global_ranger super;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c
index 2aee42f4c05..cccf9e7ba17 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c
@@ -1,6 +1,10 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fdump-tree-evrp-details" } */
 
+/* range_of_stmt will call SCEV to set global ranges for the PHI
+   results, and alter the results here.  */
+/* { dg-additional-options "-fdisable-tree-rvrp1 -fdisable-tree-rvrp2" } */
+
 extern void g (void);
 extern void bar (int);
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c
index 7b0de646a38..f81b62a94e9 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c
@@ -1,5 +1,9 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fno-rvrp-changes" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */
+
+/* range_of_stmt will call SCEV to set global ranges for the PHI
+   results, and alter the results here.  */
+/* { dg-additional-options "-fdisable-tree-rvrp1 -fdisable-tree-rvrp2" } */
 
 extern void g (void);
 extern void bar (int);


More information about the Gcc-cvs mailing list