}
}
+// This is called to update ranger's concept of a global value for NAME
+// with range R by an outside entity.
+
+void
+gimple_ranger::update_range_info (tree name, const vrange &r)
+{
+ value_range current (TREE_TYPE (name));
+ m_cache.get_global_range (current, name);
+ if (current.intersect (r))
+ m_cache.set_global_range (name, current, true);
+}
+
// This routine will export whatever global ranges are known to GCC
// SSA_RANGE_NAME_INFO and SSA_NAME_PTR_INFO fields.
virtual bool range_on_edge (vrange &r, edge e, tree name) override;
virtual bool range_on_entry (vrange &r, basic_block bb, tree name) override;
virtual bool range_on_exit (vrange &r, basic_block bb, tree name) override;
+ virtual void update_range_info (tree, const vrange &) override;
void export_global_ranges ();
virtual void dump (FILE *f) override;
void debug ();
tmp.dump (dump_file);
fputc ('\n', dump_file);
}
+ // Update the active query, if needed.
+ get_range_query (cfun)->update_range_info (name, r);
return true;
}
return false;
}
+// Default for updating range info is to do nothing.
+void
+range_query::update_range_info (tree, const vrange &)
+{
+}
+
// If the range of expr EXPR at STMT is a single value, return it.
// Otherwise return NULL_TREE.
virtual bool range_on_entry (vrange &r, basic_block bb, tree expr);
virtual bool range_on_exit (vrange &r, basic_block bb, tree expr);
+ virtual void update_range_info (tree name, const vrange &r);
+
inline class relation_oracle &relation () const { return *m_relation; }
void create_relation_oracle (bool do_trans_p = true);
void destroy_relation_oracle ();
// This is an internal interface
void share_query (range_query &q);
bool m_shared_copy_p;
-
};
// Global ranges for SSA names using SSA_NAME_RANGE_INFO.