aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-04-07 16:02:17 +0200
committerAldy Hernandez <aldyh@redhat.com>2020-04-08 13:30:34 -0400
commit9eac184417b02eede7fd909b4f61024a7d5d8e81 (patch)
tree107ee7c25aa8e13c91ec875f9135876e61964f7e /gcc
parent277d95af38df39caebf22c570ba05196fea462dc (diff)
downloadgcc-9eac184417b02eede7fd909b4f61024a7d5d8e81.zip
gcc-9eac184417b02eede7fd909b4f61024a7d5d8e81.tar.gz
gcc-9eac184417b02eede7fd909b4f61024a7d5d8e81.tar.bz2
Implement global_ranger::range_on_edge to intersect with global ssa range.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-cfg.cc1
-rw-r--r--gcc/gimple-ranger.cc14
-rw-r--r--gcc/gimple-ranger.h2
3 files changed, 16 insertions, 1 deletions
diff --git a/gcc/gimple-range-cfg.cc b/gcc/gimple-range-cfg.cc
index 36e0fe3..f7d61b8 100644
--- a/gcc/gimple-range-cfg.cc
+++ b/gcc/gimple-range-cfg.cc
@@ -86,7 +86,6 @@ gimple_ranger::range_of_stmt (irange &r, gimple *s, tree name)
// Calculate a range for NAME on edge E and return it in R.
-// Return false if no range can be determined.
void
gimple_ranger::range_on_edge (irange &r, edge e, tree name)
diff --git a/gcc/gimple-ranger.cc b/gcc/gimple-ranger.cc
index 812956d..bb53ac9 100644
--- a/gcc/gimple-ranger.cc
+++ b/gcc/gimple-ranger.cc
@@ -153,6 +153,20 @@ global_ranger::range_on_exit (irange &r, basic_block bb, tree name)
|| types_compatible_p (r.type(), TREE_TYPE (name)));
}
+// Calculate a range for NAME on edge E and return it in R.
+
+void
+global_ranger::range_on_edge (irange &r, edge e, tree name)
+{
+ super::range_on_edge (r, e, name);
+
+ if (TREE_CODE (name) == SSA_NAME)
+ {
+ widest_irange range_for_name;
+ range_of_ssa_name (range_for_name, name);
+ r.intersect (range_for_name);
+ }
+}
// Calculate a range for statement S and return it in R. If NAME is
// provided it represents the SSA_NAME on the LHS of the statement.
diff --git a/gcc/gimple-ranger.h b/gcc/gimple-ranger.h
index f2b31ed..575e670 100644
--- a/gcc/gimple-ranger.h
+++ b/gcc/gimple-ranger.h
@@ -48,6 +48,7 @@ public:
virtual void range_on_entry (irange &r, basic_block bb, tree name);
virtual void range_on_exit (irange &r, basic_block bb, tree name);
virtual bool range_of_stmt (irange &r, gimple *s, tree name = NULL_TREE);
+ virtual void range_on_edge (irange &r, edge e, tree name);
void export_global_ranges ();
@@ -57,6 +58,7 @@ 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);
private:
+ typedef gimple_ranger super; // Inherited from class for easy changing.
bool non_null_deref_p (tree name, basic_block bb);
bool block_range (irange &r, basic_block bb, tree name, bool calc = true);
void dump_block (FILE *f, basic_block bb);