d6af1f4496b382a3dba65e7e48ab90ea87f3693f
[libfirm] / include / libfirm / vrp.h
1 /*
2  * Copyright (C) 1995-2010 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 /** VRP information */
41 typedef struct {
42         int valid;                   /**< This node has valid vrp information */
43         tarval *bits_set;            /**< The bits which, by analysis, are  definitely set.
44                                           0: may be not set, 1: definitely set*/
45         tarval *bits_not_set;        /**< The bits which by analysis are definitely
46                                           not set, 1 for may be set, 0: definitely not set  */
47         enum range_types range_type; /**< The range represented by range_top, range_bottom */
48         tarval *range_bottom, *range_top;
49 } vrp_attr;
50
51 /**
52  * Set vrp data on the graph irg
53  * @param irg graph on which to set vrp data
54  */
55 void set_vrp_data(ir_graph *irg);
56
57 /**
58  * Test, if the two nodes can be compared with their vrp information
59  *
60  * @param left: the left node
61  * @param right: the right node
62  *
63  * @return the pn_Cmp, if one can be derived
64  */
65 pn_Cmp vrp_cmp(const ir_node *left, const ir_node *right);
66
67 /*
68  * Return the vrp data for this node
69  *
70  * @param n: the node for which to return the vrp information
71  *
72  * @return a pointer to the vrp data or NULL if there is none
73  */
74 vrp_attr *vrp_get_info(const ir_node *n);
75
76 #endif