RFC: Implementing a new API for value_range

Aldy Hernandez aldyh@redhat.com
Wed Oct 3 08:45:00 GMT 2018


Hi Richard.  Hi folks.

I'd like to implement a clean API that disallows direct access to any of 
the value_range internals.  My aim is a clean API with no change in 
functionality.

This is mostly a clean-up, but could also pave the way for possibly 
changing the underlying implementation in the future so we can unite VPR 
and the on-demand work with a single common code base.

I am quoting the main structure below to give an idea where I'd like to 
head, and am also attaching a proof-of-concept patch to tree-vrp.[hc]. 
It is untested and only builds cc1.

Ideally I'd like to evolve this to include other methods that make the 
VRP / vr-values code more readable.

Note: I have added a tree type field (m_type) to make it easy to 
determine the tree type of the range.  Right now a value_range looses 
the range type if UNDEFINED or VARYING, as both min/max are NULL.  If 
there is strong objection to the extra word, we could set min/max to 
integer_zero_node in the type if UNDEFINED/VARYING.  But really, all 
this will be hidden in the API, so we could change the underlying 
representation at will.

Would you be ok with this if I continue down this path?

Thanks.
Aldy

struct GTY((for_user)) value_range
{
   value_range ();
   value_range (tree type);
   value_range (tree type, value_range_type, tree, tree, bitmap = NULL);
   value_range (const value_range &);
   bool operator== (const value_range &) const;
   bool operator!= (const value_range &) const;
   void intersect (const value_range *);
   void union_ (const value_range *);

   /* Types of value ranges.  */
   bool undefined_p () const;
   bool varying_p () const;
   bool symbolic_p () const;
   bool numeric_p () const;
   void set_undefined ();
   void set_varying ();

   /* Equivalence bitmap methods.  */
   bitmap equiv () const;
   void set_equiv (bitmap);
   void equiv_free ();
   void equiv_copy (const value_range *);
   void equiv_clear ();
   void equiv_and (const value_range *);
   void equiv_ior (const value_range *);

   /* Misc methods.  */
   tree type () const;
   bool null_p () const;
   bool may_contain_p (tree) const;
   tree singleton () const;
   void canonicalize ();
   void copy_with_equiv_update (const value_range *);
   void dump () const;

   /* Temporary accessors that should eventually be removed.  */
   enum value_range_type vrtype () const;
   tree min () const;
   tree max () const;

   /* private: These are public because of GTY stupidity.  */
   enum value_range_type m_vrtype;
   tree m_min;
   tree m_max;
   tree m_type;
   /* Set of SSA names whose value ranges are equivalent to this one.
      This set is only valid when TYPE is VR_RANGE or VR_ANTI_RANGE.  */
   bitmap m_equiv;

  private:
   void init (tree type, value_range_type, tree, tree, bitmap);
   void check ();
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: curr.patch
Type: text/x-patch
Size: 56734 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20181003/90e6751b/attachment.bin>


More information about the Gcc-patches mailing list