aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-12-03 10:51:18 -0500
committerAndrew MacLeod <amacleod@redhat.com>2021-12-06 13:14:53 -0500
commited4a5f571bd3a49c495d1b08b42c8c01833061e6 (patch)
treeb6b7affca6fb653ad3d43a8bf7d3b310e76723aa
parent2a20407bacbd80662b020f9e11833077fb237115 (diff)
downloadgcc-ed4a5f571bd3a49c495d1b08b42c8c01833061e6.zip
gcc-ed4a5f571bd3a49c495d1b08b42c8c01833061e6.tar.gz
gcc-ed4a5f571bd3a49c495d1b08b42c8c01833061e6.tar.bz2
Add BB option for outgoing_edge_range_p and may_reocmpute_p.
There are times we only need to know if any edge from a block can calculate a range. * gimple-range-gori.h (class gori_compute):: Add prototypes. * gimple-range-gori.cc (gori_compute::has_edge_range_p): Add alternate API for basic block. Call for edge alterantive. (gori_compute::may_recompute_p): Ditto.
-rw-r--r--gcc/gimple-range-gori.cc74
-rw-r--r--gcc/gimple-range-gori.h6
2 files changed, 51 insertions, 29 deletions
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index 0dba34b..6c17267 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -1166,33 +1166,12 @@ gori_compute::compute_operand1_and_operand2_range (irange &r,
r.intersect (op_range);
return true;
}
-// Return TRUE if a range can be calculated or recomputed for NAME on edge E.
-
-bool
-gori_compute::has_edge_range_p (tree name, edge e)
-{
- // Check if NAME is an export or can be recomputed.
- if (e)
- return is_export_p (name, e->src) || may_recompute_p (name, e);
-
- // If no edge is specified, check if NAME can have a range calculated
- // on any edge.
- return is_export_p (name) || may_recompute_p (name);
-}
-
-// Dump what is known to GORI computes to listing file F.
-
-void
-gori_compute::dump (FILE *f)
-{
- gori_map::dump (f);
-}
-// Return TRUE if NAME can be recomputed on edge E. If any direct dependant
-// is exported on edge E, it may change the computed value of NAME.
+// Return TRUE if NAME can be recomputed on any edge exiting BB. If any
+// direct dependant is exported, it may also change the computed value of NAME.
bool
-gori_compute::may_recompute_p (tree name, edge e)
+gori_compute::may_recompute_p (tree name, basic_block bb)
{
tree dep1 = depend1 (name);
tree dep2 = depend2 (name);
@@ -1207,13 +1186,47 @@ gori_compute::may_recompute_p (tree name, edge e)
return false;
// If edge is specified, check if NAME can be recalculated on that edge.
- if (e)
- return ((is_export_p (dep1, e->src))
- || (dep2 && is_export_p (dep2, e->src)));
+ if (bb)
+ return ((is_export_p (dep1, bb))
+ || (dep2 && is_export_p (dep2, bb)));
return (is_export_p (dep1)) || (dep2 && is_export_p (dep2));
}
+// Return TRUE if NAME can be recomputed on edge E. If any direct dependant
+// is exported on edge E, it may change the computed value of NAME.
+
+bool
+gori_compute::may_recompute_p (tree name, edge e)
+{
+ gcc_checking_assert (e);
+ return may_recompute_p (name, e->src);
+}
+
+
+// Return TRUE if a range can be calculated or recomputed for NAME on any
+// edge exiting BB.
+
+bool
+gori_compute::has_edge_range_p (tree name, basic_block bb)
+{
+ // Check if NAME is an export or can be recomputed.
+ if (bb)
+ return is_export_p (name, bb) || may_recompute_p (name, bb);
+
+ // If no block is specified, check for anywhere in the IL.
+ return is_export_p (name) || may_recompute_p (name);
+}
+
+// Return TRUE if a range can be calculated or recomputed for NAME on edge E.
+
+bool
+gori_compute::has_edge_range_p (tree name, edge e)
+{
+ gcc_checking_assert (e);
+ return has_edge_range_p (name, e->src);
+}
+
// Calculate a range on edge E and return it in R. Try to evaluate a
// range for NAME on this edge. Return FALSE if this is either not a
// control edge or NAME is not defined by this edge.
@@ -1287,6 +1300,13 @@ gori_compute::outgoing_edge_range_p (irange &r, edge e, tree name,
return false;
}
+// Dump what is known to GORI computes to listing file F.
+
+void
+gori_compute::dump (FILE *f)
+{
+ gori_map::dump (f);
+}
// ------------------------------------------------------------------------
// GORI iterator. Although we have bitmap iterators, don't expose that it
diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h
index ec0b951..b15497e 100644
--- a/gcc/gimple-range-gori.h
+++ b/gcc/gimple-range-gori.h
@@ -158,10 +158,12 @@ class gori_compute : public gori_map
public:
gori_compute (int not_executable_flag = 0);
bool outgoing_edge_range_p (irange &r, edge e, tree name, range_query &q);
- bool has_edge_range_p (tree name, edge e = NULL);
+ bool has_edge_range_p (tree name, basic_block bb = NULL);
+ bool has_edge_range_p (tree name, edge e);
void dump (FILE *f);
private:
- bool may_recompute_p (tree name, edge e = NULL);
+ bool may_recompute_p (tree name, edge e);
+ bool may_recompute_p (tree name, basic_block bb = NULL);
bool compute_operand_range (irange &r, gimple *stmt, const irange &lhs,
tree name, class fur_source &src);
bool compute_operand_range_switch (irange &r, gswitch *s, const irange &lhs,