#define VRP_H
enum range_types {
- VRP_UNDEFINED,
- VRP_RANGE,
- VRP_ANTIRANGE,
- VRP_VARYING
+ VRP_UNDEFINED, /* No information could be derived so far */
+ VRP_RANGE, /* bottom and top form a range, including both values */
+ VRP_ANTIRANGE, /* range from bottom to top can not be, but borders might
+ be */
+ VRP_VARYING /* information can not be derived */
};
enum range_ops {
- VRP_NONE,
- VRP_ADD,
- VRP_SUB
+ VRP_NONE, /* range is defined absolute */
+ VRP_ADD, /* range + range_node are the possible values */
+ VRP_SUB /* range - range_node are the possible values */
};
+/** VRP information */
+typedef struct {
+ int valid; /**< This node has valid vrp information */
+ tarval *bits_set; /**< The bits which, by analysis, are definitely set.
+ 0: may be not set, 1: definitely set*/
+ tarval *bits_not_set; /**< The bits which by analysis are definitely
+ not set, 1 for may be set, 0: definitely not set */
+ ir_node *bits_node; /**< The node, from which the rest of the bits
+ are set */
+ enum range_types range_type;/**< The range represented by range_top, range_bottom */
+ tarval *range_bottom, *range_top;
+ ir_node *range_node; /**< The node to which the range is relative */
+ enum range_ops range_op; /**< The op which describes the relation
+ between range_node and range */
+} vrp_attr;
+
/**
* Set vrp data on the graph irg
* @param irg graph on which to set vrp data
*
* @return the pn_Cmp, if one can be derived
*/
-pn_Cmp vrp_cmp(ir_node *left, ir_node *right);
+pn_Cmp vrp_cmp(const ir_node *left, const ir_node *right);
+
+/*
+ * Return the vrp data for this node
+ *
+ * @param n: the node for which to return the vrp information
+ *
+ * @return a pointer to the vrp data or NULL if there is none
+ */
+vrp_attr *vrp_get_info(const ir_node *n);
#endif