bestack: Remove the unused return value from stack_frame_compute_initial_offset().
[libfirm] / ir / ana / vrp.c
index 73c1169..ac200f4 100644 (file)
@@ -21,7 +21,6 @@
  * @file
  * @brief   analyze graph to provide value range information
  * @author  Jonas Fietz
- * @version $Id$
  */
 #include "config.h"
 
@@ -38,6 +37,7 @@
 #include "irop.h"
 #include "pdeq.h"
 #include "irnodemap.h"
+#include "irhooks.h"
 #include "bitset.h"
 #include "debug.h"
 
@@ -51,13 +51,12 @@ typedef struct vrp_env_t {
 
 static vrp_attr *vrp_get_or_set_info(ir_vrp_info *info, const ir_node *node)
 {
-       vrp_attr *attr = ir_nodemap_get(&info->infos, node);
+       vrp_attr *attr = ir_nodemap_get(vrp_attr, &info->infos, node);
        if (attr == NULL) {
                ir_mode *mode = get_irn_mode(node);
                assert(mode_is_int(mode));
 
-               attr = obstack_alloc(&info->obst, sizeof(*attr));
-               memset(attr, 0, sizeof(*attr));
+               attr = OALLOCZ(&info->obst, vrp_attr);
                attr->range_type   = VRP_UNDEFINED;
                attr->bits_set     = get_mode_null(mode);
                attr->bits_not_set = get_mode_all_one(mode);
@@ -74,7 +73,7 @@ vrp_attr *vrp_get_info(const ir_node *node)
        ir_graph *irg = get_irn_irg(node);
        if (irg->vrp.infos.data == NULL)
                return NULL;
-       return (vrp_attr*) ir_nodemap_get(&irg->vrp.infos, node);
+       return ir_nodemap_get(vrp_attr, &irg->vrp.infos, node);
 }
 
 static int vrp_update_node(ir_vrp_info *info, ir_node *node)
@@ -423,7 +422,7 @@ static int vrp_update_node(ir_vrp_info *info, ir_node *node)
        /* Merge the newly calculated values with those that might already exist*/
        if (new_bits_set != tarval_bad) {
                new_bits_set = tarval_or(new_bits_set, vrp->bits_set);
-               if (tarval_cmp(new_bits_set, vrp->bits_set) != ir_relation_equal) {
+               if (new_bits_set != vrp->bits_set) {
                        something_changed = 1;
                        vrp->bits_set = new_bits_set;
                }
@@ -431,7 +430,7 @@ static int vrp_update_node(ir_vrp_info *info, ir_node *node)
        if (new_bits_not_set != tarval_bad) {
                new_bits_not_set = tarval_and(new_bits_not_set, vrp->bits_not_set);
 
-               if (tarval_cmp(new_bits_not_set, vrp->bits_not_set) != ir_relation_equal) {
+               if (new_bits_not_set != vrp->bits_not_set) {
                        something_changed = 1;
                        vrp->bits_not_set = new_bits_not_set;
                }
@@ -515,7 +514,7 @@ static void vrp_first_pass(ir_node *n, void *e)
 
        vrp_update_node(env->info, n);
 
-       assure_irg_outs(get_current_ir_graph());
+       assure_irg_outs(get_irn_irg(n));
        for (i = get_irn_n_outs(n) - 1; i >=0; --i) {
                ir_node *succ = get_irn_out(n, i);
                if (bitset_is_set(env->visited, get_irn_idx(succ))) {
@@ -525,6 +524,29 @@ static void vrp_first_pass(ir_node *n, void *e)
        }
 }
 
+static void dump_vrp_info(void *ctx, FILE *F, const ir_node *node)
+{
+       vrp_attr *vrp;
+
+       (void) ctx;
+       if (!mode_is_int(get_irn_mode(node)))
+               return;
+
+       vrp = vrp_get_info(node);
+       if (vrp == NULL)
+               return;
+
+       fprintf(F, "vrp range type: %d\n", (int) vrp->range_type);
+       if (vrp->range_type == VRP_RANGE || vrp->range_type == VRP_ANTIRANGE) {
+               ir_fprintf(F, "vrp range bottom: %T\n",vrp->range_bottom);
+               ir_fprintf(F, "vrp range top: %T\n", vrp->range_top);
+       }
+       ir_fprintf(F, "vrp bits set: %T\n", vrp->bits_set);
+       ir_fprintf(F, "vrp bits not set: %T\n", vrp->bits_not_set);
+}
+
+static hook_entry_t dump_hook;
+
 void set_vrp_data(ir_graph *irg)
 {
        ir_node *succ, *node;
@@ -542,7 +564,12 @@ void set_vrp_data(ir_graph *irg)
        obstack_init(&irg->vrp.obst);
        info = &irg->vrp;
 
-       env = obstack_alloc(&irg->vrp.obst, sizeof(*env));
+       if (dump_hook.hook._hook_node_info == NULL) {
+               dump_hook.hook._hook_node_info = dump_vrp_info;
+               register_hook(hook_node_info, &dump_hook);
+       }
+
+       env = OALLOCZ(&irg->vrp.obst, vrp_env_t);
        env->workqueue = new_waitq();
        env->info      = info;