rewrite vrp scanning to use a phase instead of attrs in ir_node
[libfirm] / include / libfirm / vrp.h
1 /*
2  * Copyright (C) 1995-2009 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Analyse the graph with value range propagation
23  * @author  Jonas Fietz
24  * @version $Id$
25  *
26  */
27 #include "firm_types.h"
28
29 #ifndef VRP_H
30 #define VRP_H
31
32 enum range_types {
33         VRP_UNDEFINED, /* No information could be derived so far */
34         VRP_RANGE, /* bottom and top form a range, including both values */
35         VRP_ANTIRANGE, /* range from bottom to top can not be, but borders might
36                                           be */
37         VRP_VARYING /* information can not be derived */
38 };
39
40 enum range_ops {
41         VRP_NONE, /* range is defined absolute */
42         VRP_ADD, /* range + range_node are the possible values */
43         VRP_SUB /* range - range_node are the possible values */
44 };
45
46 /** VRP information */
47 typedef struct {
48         int valid; /**< This node has valid vrp information */
49         tarval *bits_set;          /**< The bits which, by analysis, are  definitely set.
50                                                                         0: may be not set, 1: definitely set*/
51         tarval *bits_not_set;  /**< The bits which by analysis are definitely
52                                                          not set, 1 for may be set, 0: definitely not set  */
53         ir_node *bits_node;                     /**< The node, from which the rest of the bits
54                                                                                           are set */
55         enum range_types range_type;/**< The range represented by range_top,  range_bottom */
56         tarval *range_bottom, *range_top;
57         ir_node *range_node;            /**< The node to which the range is relative */
58         enum range_ops range_op;            /**< The op which describes the relation
59                                                                  between range_node and range */
60 } vrp_attr;
61
62 /**
63  * Set vrp data on the graph irg
64  * @param irg graph on which to set vrp data
65  */
66 void set_vrp_data(ir_graph *irg);
67
68 /**
69  * Creates an ir_prog_pass for vrp
70  *
71  * @param name the name of this pass or NULL
72  */
73 ir_graph_pass_t *set_vrp_pass(const char *name);
74
75 /**
76  * Test, if the two nodes can be compared with their vrp information
77  *
78  * @param left: the left node
79  * @param right: the right node
80  *
81  * @return the pn_Cmp, if one can be derived
82  */
83 pn_Cmp vrp_cmp(const ir_node *left, const ir_node *right);
84
85 /*
86  * Return the vrp data for this node
87  *
88  * @param n: the node for which to return the vrp information
89  *
90  * @return a pointer to the vrp data or NULL if there is none
91  */
92 vrp_attr *vrp_get_info(const ir_node *n);
93
94 #endif