aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range.h
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-06-17 14:09:48 -0400
committerAndrew MacLeod <amacleod@redhat.com>2021-06-22 08:11:45 -0400
commita2c9173331914eff3d728c07afaeee71892689ba (patch)
tree8912aa396388e124d9f9f769da0ae9e91f0d5d51 /gcc/gimple-range.h
parent80dd13f5c3bdc7899ee6e863e05b254815ec0cef (diff)
downloadgcc-a2c9173331914eff3d728c07afaeee71892689ba.zip
gcc-a2c9173331914eff3d728c07afaeee71892689ba.tar.gz
gcc-a2c9173331914eff3d728c07afaeee71892689ba.tar.bz2
Add relational support to fold_using_range
Enable a relation oracle in ranger, and add full range-op relation support to fold_using_range. * gimple-range-cache.cc (ranger_cache::ranger_cache): Create a relation_oracle if dominators exist. (ranger_cache::~ranger_cache): Dispose of oracle. (ranger_cache::dump_bb): Dump oracle. * gimple-range.cc (fur_source::fur_source): New. (fur_source::get_operand): Use mmeber query. (fur_source::get_phi_operand): Use member_query. (fur_source::query_relation): New. (fur_source::register_dependency): Delete. (fur_source::register_relation): New. (fur_edge::fur_edge): Adjust. (fur_edge::get_phi_operand): Fix comment. (fur_edge::query): Delete. (fur_stmt::fur_stmt): Adjust. (fur_stmt::query): Delete. (fur_depend::fur_depend): Adjust. (fur_depend::register_relation): New. (fur_depend::register_relation): New. (fur_list::fur_list): Adjust. (fur_list::get_operand): Use member query. (fold_using_range::range_of_range_op): Process and query relations. (fold_using_range::range_of_address): Adjust dependency call. (fold_using_range::range_of_phi): Ditto. (gimple_ranger::gimple_ranger): New. Use ranger_ache oracle. (fold_using_range::relation_fold_and_or): New. (fold_using_range::postfold_gcond_edges): New. * gimple-range.h (class gimple_ranger): Adjust. (class fur_source): Adjust members. (class fur_stmt): Ditto. (class fold_using_range): Ditto.
Diffstat (limited to 'gcc/gimple-range.h')
-rw-r--r--gcc/gimple-range.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h
index b9cffdb..87911b9 100644
--- a/gcc/gimple-range.h
+++ b/gcc/gimple-range.h
@@ -58,6 +58,7 @@ along with GCC; see the file COPYING3. If not see
class gimple_ranger : public range_query
{
public:
+ gimple_ranger ();
virtual bool range_of_stmt (irange &r, gimple *, tree name = NULL) OVERRIDE;
virtual bool range_of_expr (irange &r, tree name, gimple * = NULL) OVERRIDE;
virtual bool range_on_edge (irange &r, edge e, tree name) OVERRIDE;
@@ -74,15 +75,25 @@ protected:
// Source of all operands for fold_using_range and gori_compute.
// It abstracts out the source of an operand so it can come from a stmt or
-// and edge or anywhere a derived classof fur_source wants.
+// and edge or anywhere a derived class of fur_source wants.
+// THe default simply picks up ranges from the current range_query.
class fur_source
{
public:
+ fur_source (range_query *q = NULL);
+ inline range_query *query () { return m_query; }
+ inline class gori_compute *gori () { return m_gori; };
virtual bool get_operand (irange &r, tree expr);
virtual bool get_phi_operand (irange &r, tree expr, edge e);
- virtual void register_dependency (tree lhs, tree rhs);
- virtual range_query *query ();
+ virtual relation_kind query_relation (tree op1, tree op2);
+ virtual void register_relation (gimple *stmt, relation_kind k, tree op1,
+ tree op2);
+ virtual void register_relation (edge e, relation_kind k, tree op1,
+ tree op2);
+protected:
+ range_query *m_query;
+ gori_compute *m_gori;
};
// fur_stmt is the specification for drawing an operand from range_query Q
@@ -94,9 +105,8 @@ public:
fur_stmt (gimple *s, range_query *q = NULL);
virtual bool get_operand (irange &r, tree expr) OVERRIDE;
virtual bool get_phi_operand (irange &r, tree expr, edge e) OVERRIDE;
- virtual range_query *query () OVERRIDE;
+ virtual relation_kind query_relation (tree op1, tree op2) OVERRIDE;
private:
- range_query *m_query;
gimple *m_stmt;
};
@@ -132,6 +142,8 @@ protected:
bool range_of_phi (irange &r, gphi *phi, fur_source &src);
void range_of_ssa_name_with_loop_info (irange &, tree, class loop *, gphi *,
fur_source &src);
+ void relation_fold_and_or (irange& lhs_range, gimple *s, fur_source &src);
+ void postfold_gcond_edges (gcond *s, fur_source &src);
};