diff options
| author | Andrew MacLeod <amacleod@redhat.com> | 2024-04-29 13:32:00 -0400 |
|---|---|---|
| committer | Andrew MacLeod <amacleod@redhat.com> | 2024-05-23 16:40:34 -0400 |
| commit | 67afcf28570ff62210e1998f35def2be5cb8cb08 (patch) | |
| tree | 8af751b79580773d72775179b5bd161447a59eb0 /gcc/value-relation.cc | |
| parent | ed63cd2aa5b114565fe5499c3a6bf8da5e8e48ba (diff) | |
| download | gcc-67afcf28570ff62210e1998f35def2be5cb8cb08.zip gcc-67afcf28570ff62210e1998f35def2be5cb8cb08.tar.gz gcc-67afcf28570ff62210e1998f35def2be5cb8cb08.tar.bz2 | |
Move all relation queries into relation_oracle.
Move relation queries from range_query object into the relation oracle.
* gimple-range-cache.cc (ranger_cache::ranger_cache): Call
create_relation_oracle.
(ranger_cache::~ranger_cache): Call destroy_relation_oracle.
* gimple-range-fold.cc (fur_stmt::get_phi_operand): Check for
relation oracle bnefore calling query_relation.
(fold_using_range::range_of_phi): Likewise.
* gimple-range-path.cc (path_range_query::~path_range_query): Set
relation oracle pointer to NULL when done.
* gimple-range.cc (gimple_ranger::~gimple_ranger): Likewise.
* value-query.cc (range_query::~range_query): Ensure any
relation oracle is destroyed.
(range_query::query_relation): relocate to relation_oracle object.
* value-query.h (class range_query): Adjust method proototypes.
(range_query::create_relation_oracle): New.
(range_query::destroy_relation_oracle): New.
* value-relation.cc (relation_oracle::query_relation): Relocate
from range query class.
* value-relation.h (Call relation_oracle): New prototypes.
Diffstat (limited to 'gcc/value-relation.cc')
| -rw-r--r-- | gcc/value-relation.cc | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc index 619ee5f..d1081b3 100644 --- a/gcc/value-relation.cc +++ b/gcc/value-relation.cc @@ -288,6 +288,39 @@ relation_oracle::valid_equivs (bitmap b, const_bitmap equivs, basic_block bb) } } +// Return any known relation between SSA1 and SSA2 before stmt S is executed. +// If GET_RANGE is true, query the range of both operands first to ensure +// the definitions have been processed and any relations have be created. + +relation_kind +relation_oracle::query_relation (gimple *s, tree ssa1, tree ssa2) +{ + if (TREE_CODE (ssa1) != SSA_NAME || TREE_CODE (ssa2) != SSA_NAME) + return VREL_VARYING; + return query_relation (gimple_bb (s), ssa1, ssa2); +} + +// Return any known relation between SSA1 and SSA2 on edge E. +// If GET_RANGE is true, query the range of both operands first to ensure +// the definitions have been processed and any relations have be created. + +relation_kind +relation_oracle::query_relation (edge e, tree ssa1, tree ssa2) +{ + basic_block bb; + if (TREE_CODE (ssa1) != SSA_NAME || TREE_CODE (ssa2) != SSA_NAME) + return VREL_VARYING; + + // Use destination block if it has a single predecessor, and this picks + // up any relation on the edge. + // Otherwise choose the src edge and the result is the same as on-exit. + if (!single_pred_p (e->dest)) + bb = e->src; + else + bb = e->dest; + + return query_relation (bb, ssa1, ssa2); +} // ------------------------------------------------------------------------- // The very first element in the m_equiv chain is actually just a summary |
