From 67afcf28570ff62210e1998f35def2be5cb8cb08 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Mon, 29 Apr 2024 13:32:00 -0400 Subject: 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. --- gcc/value-relation.cc | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'gcc/value-relation.cc') 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 -- cgit v1.1