2 * Copyright (C) 1995-2009 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
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.
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.
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
22 * @brief analyze graph to provide value range information
32 #include "irgraph_t.h"
40 #include "irphase_t.h"
44 static void *VISITED = &v;
50 static int vrp_update_node(ir_node *node)
52 tarval *new_bits_set = get_tarval_bad();
53 tarval *new_bits_not_set = get_tarval_bad();
54 tarval *new_range_bottom = get_tarval_bad();
55 tarval *new_range_top = get_tarval_bad();
56 ir_node *new_bits_node = NULL;
57 ir_node *new_range_node = NULL;
58 enum range_types new_range_type = VRP_UNDEFINED;
59 enum range_ops new_range_op = VRP_NONE;
60 int something_changed = 0;
64 if (!mode_is_int(get_irn_mode(node))) {
65 return 0; /* we don't optimize for non-int-nodes*/
68 phase = get_irg_phase(get_irn_irg(node), PHASE_VRP);
70 ir_printf("update_vrp for %d called\n", get_irn_node_nr(node));
71 vrp = phase_get_or_set_irn_data(phase, node);
73 /* TODO: Check if all predecessors have valid VRP information*/
77 switch (get_irn_opcode(node)) {
79 tarval *tv = get_Const_tarval(node);
81 new_bits_not_set = tarval_not(tv);
82 new_range_bottom = tv;
84 new_range_type = VRP_RANGE;
89 vrp_attr *vrp_left, *vrp_right;
90 ir_node *left, *right;
93 left = get_And_left(node);
94 right = get_And_right(node);
95 vrp_left = phase_get_or_set_irn_data(phase, left);
96 vrp_right = phase_get_or_set_irn_data(phase, right);
99 new_bits_set = tarval_and(vrp_left->bits_set, vrp_right->bits_set);
100 new_bits_not_set = tarval_or(vrp_left->bits_not_set, vrp_right->bits_not_set);
102 tmp_tv = tarval_not(vrp_left->bits_set);
103 tmp_tv = tarval_eor(vrp_left->bits_not_set, tmp_tv);
104 /*check if one of the predecessors is completely determined*/
105 if (tarval_is_null(tmp_tv)) {
106 new_bits_node = right;
109 tmp_tv = tarval_not(vrp_right->bits_set);
110 tmp_tv = tarval_eor(vrp_right->bits_not_set, tmp_tv);
111 if (tarval_is_null(tmp_tv)) {
112 new_bits_node = left;
118 vrp_attr *vrp_left, *vrp_right;
119 vrp_left = phase_get_or_set_irn_data(phase, get_Add_left(node));
120 vrp_right = phase_get_or_set_irn_data(phase, get_Add_right(node));
121 int overflow_top, overflow_bottom;
122 tarval *new_top, *new_bottom;
124 if (vrp_left->range_type == VRP_UNDEFINED || vrp_right->range_type ==
125 VRP_UNDEFINED || vrp_left->range_type == VRP_VARYING ||
126 vrp_right->range_type == VRP_VARYING) {
130 new_top = tarval_add(vrp_left->range_top, vrp_right->range_top);
131 overflow_top = tarval_carry();
132 new_bottom = tarval_add(vrp_left->range_bottom, vrp_right->range_bottom);
133 overflow_bottom = tarval_carry();
135 if (!overflow_top && !overflow_bottom && vrp_left->range_type == VRP_RANGE
136 &&vrp_right->range_type == VRP_RANGE) {
137 new_range_bottom = new_bottom;
138 new_range_top = new_top;
139 new_range_type = VRP_RANGE;
142 if (overflow_top || overflow_bottom) {
143 /* TODO Implement overflow handling*/
144 new_range_type = VRP_UNDEFINED;
150 vrp_attr *vrp_left, *vrp_right;
151 vrp_left = phase_get_or_set_irn_data(phase, get_Sub_left(node));
152 vrp_right = phase_get_or_set_irn_data(phase, get_Sub_right(node));
153 int overflow_top, overflow_bottom;
154 tarval *new_top, *new_bottom;
156 if (vrp_left->range_type == VRP_UNDEFINED || vrp_right->range_type ==
161 new_top = tarval_sub(vrp_left->range_top, vrp_right->range_top, NULL);
162 overflow_top = tarval_carry();
163 new_bottom = tarval_sub(vrp_left->range_bottom, vrp_right->range_bottom, NULL);
164 overflow_bottom = tarval_carry();
166 if (!overflow_top && !overflow_bottom && vrp_left->range_type == VRP_RANGE
167 &&vrp_right->range_type == VRP_RANGE) {
168 new_range_bottom = new_bottom;
169 new_range_top = new_top;
170 new_range_type = VRP_RANGE;
173 if (overflow_top || overflow_bottom) {
174 /* TODO Implement overflow handling*/
180 vrp_attr *vrp_left, *vrp_right;
181 ir_node *left, *right;
184 left = get_Or_left(node);
185 right = get_Or_right(node);
187 vrp_left = phase_get_or_set_irn_data(phase, get_Or_left(node));
188 vrp_right = phase_get_or_set_irn_data(phase, get_Or_right(node));
190 new_bits_set = tarval_or(vrp_left->bits_set, vrp_right->bits_set);
191 new_bits_not_set = tarval_and(vrp_left->bits_not_set, vrp_right->bits_not_set);
193 tmp_tv = tarval_not(vrp_left->bits_set);
194 tmp_tv = tarval_eor(vrp_left->bits_not_set, tmp_tv);
195 /*check if one of the predecessors is completely determined*/
196 if (tarval_is_null(tmp_tv)) {
197 new_bits_node = right;
200 tmp_tv = tarval_not(vrp_right->bits_set);
201 tmp_tv = tarval_eor(vrp_right->bits_not_set, tmp_tv);
202 if (tarval_is_null(tmp_tv)) {
203 new_bits_node = left;
209 vrp_attr *vrp_left, *vrp_right;
210 ir_node *right = get_Rotl_right(node);
212 vrp_left = phase_get_or_set_irn_data(phase, get_Rotl_left(node));
213 vrp_right = phase_get_or_set_irn_data(phase, get_Rotl_right(node));
215 /* We can only compute this if the right value is a constant*/
216 if (is_Const(right)) {
217 tarval *bits_set, *bits_not_set;
218 bits_set = tarval_rotl(vrp_left->bits_set, get_Const_tarval(right));
219 bits_not_set = tarval_rotl(vrp_left->bits_not_set, get_Const_tarval(right));
221 new_bits_set = tarval_or(bits_set, vrp->bits_set);
222 new_bits_not_set = tarval_or(bits_not_set, vrp->bits_not_set);
228 vrp_attr *vrp_left, *vrp_right;
229 ir_node *right = get_Shl_right(node);
230 vrp_left = phase_get_or_set_irn_data(phase, get_Shl_left(node));
231 vrp_right = phase_get_or_set_irn_data(phase, get_Shl_right(node));
233 /* We can only compute this if the right value is a constant*/
234 if (is_Const(right)) {
235 tarval *bits_set, *bits_not_set;
236 ir_mode *m = get_tarval_mode(vrp->bits_not_set);
237 bits_set = tarval_shl(vrp_left->bits_set, get_Const_tarval(right));
238 bits_not_set = tarval_shl(vrp_left->bits_not_set, get_Const_tarval(right));
240 new_bits_set = tarval_or(bits_set, vrp->bits_set);
241 new_bits_not_set = tarval_or(bits_not_set, vrp->bits_not_set);
243 bits_not_set = tarval_not( tarval_shl(
245 get_Const_tarval(right)));
246 new_bits_not_set = tarval_or(bits_not_set, new_bits_not_set);
253 vrp_attr *vrp_left, *vrp_right;
254 ir_node *right = get_Shr_right(node);
256 vrp_left = phase_get_or_set_irn_data(phase, get_Shr_left(node));
257 vrp_right = phase_get_or_set_irn_data(phase, get_Shr_right(node));
259 /* We can only compute this if the right value is a constant*/
260 if (is_Const(right)) {
261 tarval *bits_set, *bits_not_set;
262 ir_mode *m = get_tarval_mode(vrp->bits_not_set);
263 bits_set = tarval_shr(vrp_left->bits_set, get_Const_tarval(right));
264 bits_not_set = tarval_shr(vrp_left->bits_not_set, get_Const_tarval(right));
266 new_bits_set = tarval_or(bits_set, vrp->bits_set);
267 new_bits_not_set = tarval_or(bits_not_set, vrp->bits_not_set);
269 bits_not_set = tarval_not( tarval_shr(
271 get_Const_tarval(right)));
272 new_bits_not_set = tarval_or(bits_not_set, new_bits_not_set);
278 vrp_attr *vrp_left, *vrp_right;
279 ir_node *right = get_Shrs_right(node);
281 vrp_left = phase_get_or_set_irn_data(phase, get_Shrs_left(node));
282 vrp_right = phase_get_or_set_irn_data(phase, get_Shrs_right(node));
284 /* We can only compute this if the right value is a constant*/
285 if (is_Const(right)) {
286 tarval *bits_set, *bits_not_set;
287 ir_mode *m = get_tarval_mode(vrp->bits_not_set);
288 bits_set = tarval_shrs(vrp_left->bits_set, get_Const_tarval(right));
289 bits_not_set = tarval_shrs(vrp_left->bits_not_set, get_Const_tarval(right));
291 new_bits_set = tarval_or(bits_set, vrp->bits_set);
292 new_bits_not_set = tarval_or(bits_not_set, vrp->bits_not_set);
294 bits_not_set = tarval_not( tarval_shrs(
296 get_Const_tarval(right)));
297 new_bits_not_set = tarval_or(bits_not_set, new_bits_not_set);
303 vrp_attr *vrp_left, *vrp_right;
305 vrp_left = phase_get_or_set_irn_data(phase, get_Eor_left(node));
306 vrp_right = phase_get_or_set_irn_data(phase, get_Eor_right(node));
308 tarval *bits_set, *bits_not_set;
309 bits_not_set = tarval_or(
310 tarval_and(vrp_left->bits_set, vrp_right->bits_set),
311 tarval_and(vrp_left->bits_not_set,
312 vrp_right->bits_not_set));
314 bits_set = tarval_or(
315 tarval_and(vrp_left->bits_set, vrp_right->bits_not_set),
316 tarval_and(vrp_left->bits_not_set, vrp_right->bits_set));
318 new_bits_set = tarval_or(bits_set, vrp->bits_set);
319 new_bits_not_set = tarval_or(bits_not_set, vrp->bits_not_set);
324 vrp_attr *vrp_pred = phase_get_or_set_irn_data(phase, get_Id_pred(node));
325 new_bits_set = vrp_pred->bits_set;
326 new_bits_not_set = vrp_pred->bits_not_set;
327 new_range_top = vrp_pred->range_top;
328 new_range_bottom = vrp_pred->range_bottom;
329 new_range_type = vrp_pred->range_type;
334 vrp_attr *vrp_pred = phase_get_or_set_irn_data(phase, get_Not_op(node));
335 new_bits_set = tarval_or(vrp_pred->bits_not_set, vrp->bits_set);
336 new_bits_not_set = tarval_or(vrp_pred->bits_set, vrp->bits_not_set);
341 ir_node *pred = get_Conv_op(node);
342 ir_mode *old_mode = get_irn_mode(pred);
343 vrp_attr *vrp_pred = phase_get_or_set_irn_data(phase, pred);
346 tarval *bits_not_set;
348 if (!mode_is_int(old_mode))
351 new_mode = get_irn_mode(node);
353 /* The second and is needed if target type is smaller*/
354 bits_not_set = tarval_not(
355 tarval_convert_to(get_mode_all_one(old_mode),
358 bits_not_set = tarval_or(bits_not_set, tarval_convert_to(vrp_pred->bits_not_set, new_mode));
359 new_bits_not_set = tarval_or(bits_not_set, vrp->bits_not_set);
360 new_bits_set = tarval_and(
361 tarval_not(bits_not_set), tarval_convert_to(vrp_pred->bits_set, new_mode));
363 if (tarval_cmp(vrp_pred->range_top, get_mode_max(new_mode)) == pn_Cmp_Le) {
364 vrp->range_top = vrp_pred->range_top;
367 if (tarval_cmp(vrp_pred->range_bottom, get_mode_min(new_mode)) == pn_Cmp_Ge) {
368 vrp->range_bottom = vrp_pred->range_bottom;
374 pn_Cmp cmp = get_Confirm_cmp(node);
375 ir_node *bound = get_Confirm_bound(node);
377 /** @todo: Handle non-Const bounds */
379 if (cmp == pn_Cmp_Lg) {
380 /** @todo: Is there some way to preserve the information? */
381 new_range_type = VRP_ANTIRANGE;
382 if (is_Const(bound)) {
383 new_range_top = get_Const_tarval(bound);
384 new_range_bottom = get_Const_tarval(bound);
386 } else if (cmp == pn_Cmp_Le) {
387 if (vrp->range_type == VRP_UNDEFINED) {
388 new_range_type = VRP_RANGE;
389 if (is_Const(bound)) {
390 new_range_top = get_Const_tarval(bound);
392 new_range_bottom = get_tarval_min(get_irn_mode(node));
393 } else if (vrp->range_type == VRP_RANGE) {
394 if (is_Const(bound)) {
395 if (tarval_cmp(vrp->range_top,
396 get_Const_tarval(bound)) == pn_Cmp_Le) {
397 new_range_top = get_Const_tarval(bound);
399 new_range_bottom = get_tarval_min(get_irn_mode(node));
401 } else if (vrp->range_type == VRP_ANTIRANGE) {
402 /** @todo: How do we manage not to get a never ending loop? */
410 /* combine all ranges*/
412 ir_node *pred = get_Phi_pred(node,0);
413 vrp_attr *vrp_pred = phase_get_or_set_irn_data(phase, pred);
414 new_range_top = vrp_pred->range_top;
415 new_range_bottom = vrp_pred->range_bottom;
416 new_range_type = vrp_pred->range_type;
417 new_bits_set = vrp_pred->bits_set;
418 new_bits_not_set = vrp_pred->bits_not_set;
420 int num = get_Phi_n_preds(node);
427 for (i = 1; i < num; i++) {
428 pred = get_Phi_pred(node, i);
429 vrp_pred = phase_get_or_set_irn_data(phase, pred);
430 if (new_range_type == VRP_RANGE && vrp_pred->range_type ==
432 cmp = tarval_cmp(new_range_top, vrp_pred->range_top);
433 if (cmp == pn_Cmp_Lt) {
434 new_range_top = vrp_pred->range_top;
436 cmp = tarval_cmp(new_range_bottom, vrp_pred->range_bottom);
437 if (cmp == pn_Cmp_Gt) {
438 new_range_bottom = vrp_pred->range_bottom;
441 new_range_type = VRP_VARYING;
449 /* unhandled, therefore never updated */
455 /* TODO: Check, if there can be information derived from any of these:
456 is_Abs(node) is_Alloc(node) is_Anchor(node) is_Borrow(node) is_Bound(node)
457 is_Break(node) is_Builtin(node) is_Call(node) is_CallBegin(node)
458 is_Carry(node) is_Cast(node) is_Cmp(node) is_Cond(node)
459 is_CopyB(node) is_Div(node) is_DivMod(node) is_Dummy(node)
460 is_End(node) is_EndExcept(node) is_EndReg(node) is_Filter(node) is_Free(node)
461 is_IJmp(node) is_InstOf(node) is_Jmp(node) is_Load(node) is_Minus(node)
462 is_Mod(node) is_Mul(node) is_Mulh(node) is_Mux(node) is_NoMem(node)
463 is_Pin(node) is_Proj(node) is_Quot(node)
464 is_Raise(node) is_Return(node) is_Sel(node) is_Start(node) is_Store(node)
465 is_SymConst(node) is_Sync(node) is_Tuple(node)
468 /* Merge the newly calculated values with those that might already exist*/
469 if (new_bits_set != tarval_bad) {
470 new_bits_set = tarval_or(new_bits_set, vrp->bits_set);
471 if (tarval_cmp(new_bits_set, vrp->bits_set) != pn_Cmp_Eq) {
472 something_changed = 1;
473 vrp->bits_set = new_bits_set;
477 if (new_bits_not_set != tarval_bad) {
478 new_bits_not_set = tarval_or(new_bits_not_set, vrp->bits_not_set);
480 if (tarval_cmp(new_bits_not_set, vrp->bits_not_set) != pn_Cmp_Eq) {
481 something_changed = 1;
482 vrp->bits_not_set = new_bits_not_set;
486 if (vrp->bits_node == NULL && new_bits_node != NULL) {
487 something_changed = 1;
488 vrp->bits_node = new_bits_node;
491 if (vrp->range_type == VRP_UNDEFINED &&
492 new_range_type != VRP_UNDEFINED) {
493 something_changed = 1;
494 vrp->range_type = new_range_type;
495 vrp->range_bottom = new_range_bottom;
496 vrp->range_top = new_range_top;
497 vrp->range_op = new_range_op;
498 vrp->range_node = new_range_node;
500 } else if (vrp->range_type == VRP_RANGE) {
501 if (new_range_type == VRP_RANGE) {
502 if ((new_range_node == NULL && vrp->range_node == NULL) ||
503 (new_range_node == vrp->range_node &&
504 new_range_op == vrp->range_op)) {
505 if (tarval_cmp(vrp->range_bottom, new_range_bottom) == pn_Cmp_Lt) {
506 something_changed = 1;
507 vrp->range_bottom = new_range_bottom;
509 if (tarval_cmp(vrp->range_top, new_range_top) == pn_Cmp_Gt) {
510 something_changed = 1;
511 vrp->range_top = new_range_top;
515 /* prefer the absolute value*/
516 if (new_range_node == NULL && vrp->range_node != NULL) {
517 something_changed = 1;
518 vrp->range_node = NULL;
519 vrp->range_top = new_range_top;
520 vrp->range_bottom = new_range_bottom;
524 if (new_range_type == VRP_ANTIRANGE) {
525 /* if they are overlapping, cut the range.*/
526 /* TODO: Maybe we can preserve more information here*/
527 if (new_range_node == NULL && vrp->range_node == NULL) {
528 if (tarval_cmp(vrp->range_bottom, new_range_top) == pn_Cmp_Gt &&
529 tarval_cmp(vrp->range_bottom, new_range_bottom) == pn_Cmp_Gt) {
530 something_changed = 1;
531 vrp->range_bottom = new_range_top;
533 } else if (tarval_cmp(vrp->range_top, new_range_bottom) == pn_Cmp_Gt &&
534 tarval_cmp(vrp->range_top, new_range_top) == pn_Cmp_Lt) {
535 something_changed = 1;
536 vrp->range_top = new_range_bottom;
539 /* We can not handle the case where the anti range is in the*/
543 /* prefer the absolute value*/
544 if (new_range_node == NULL && vrp->range_node != NULL) {
545 something_changed = 1;
546 vrp->range_node = NULL;
547 vrp->range_top = new_range_top;
548 vrp->range_bottom = new_range_bottom;
551 } else if (vrp->range_type == VRP_ANTIRANGE) {
552 if (new_range_type == VRP_ANTIRANGE) {
553 if ((new_range_node == NULL && vrp->range_node == NULL) ||
554 (new_range_node == vrp->range_node &&
555 new_range_op == vrp->range_op)) {
556 if (tarval_cmp(vrp->range_bottom, new_range_bottom) == pn_Cmp_Gt) {
557 something_changed = 1;
558 vrp->range_bottom = new_range_bottom;
560 if (tarval_cmp(vrp->range_top, new_range_top) == pn_Cmp_Lt) {
561 something_changed = 1;
562 vrp->range_top = new_range_top;
566 /* prefer the absolute value*/
567 if (new_range_node == NULL && vrp->range_node != NULL) {
568 something_changed = 1;
569 vrp->range_node = NULL;
570 vrp->range_top = new_range_top;
571 vrp->range_bottom = new_range_bottom;
575 if (new_range_type == VRP_RANGE) {
576 if ((new_range_node == NULL && vrp->range_node == NULL) ||
577 (new_range_node == vrp->range_node &&
578 new_range_op == vrp->range_op)) {
579 if (tarval_cmp(vrp->range_bottom, new_range_top) == pn_Cmp_Gt) {
580 something_changed = 1;
581 vrp->range_bottom = new_range_top;
583 if (tarval_cmp(vrp->range_top, new_range_bottom) == pn_Cmp_Lt) {
584 something_changed = 1;
585 vrp->range_top = new_range_bottom;
589 /* prefer the absolute value*/
590 if (new_range_node == NULL && vrp->range_node != NULL) {
591 something_changed = 1;
592 vrp->range_node = NULL;
593 vrp->range_top = new_range_top;
594 vrp->range_bottom = new_range_bottom;
599 assert(tarval_is_null(
600 tarval_and(vrp->bits_set, vrp->bits_not_set)));
601 return something_changed;
604 static void vrp_first_pass(ir_node *n, void *e)
608 struct vrp_env_t *env = e;
613 set_irn_link(n, VISITED);
617 for (i = get_irn_n_outs(n) - 1; i >=0; --i) {
618 succ = get_irn_out(n, i);
619 if (get_irn_link(succ) == VISITED) {
621 waitq_put(env->workqueue, n);
626 static void *vrp_init_node(ir_phase *phase, const ir_node *n, void *old)
628 ir_printf("initialized node nr: %d\n", get_irn_node_nr(n));
631 assert(1==0 && "init called for node already initialized");
633 vrp_attr *vrp = phase_alloc(phase, sizeof(vrp_attr));
635 memset(vrp, 0, sizeof(vrp_attr));
636 /* Initialize the vrp information to default */
638 mode = get_irn_mode(n);
640 vrp->range_type = VRP_UNDEFINED;
642 /* TODO: We might be able to optimize space usage if we do not allocate
643 * vrp space for non-int nodes. (currently caught by vrp_update_node)
645 if (mode_is_int(mode)) {
646 // We are assuming that 0 is always represented as 0x0000
648 vrp->bits_set = new_tarval_from_long(0, mode);
649 vrp->bits_not_set = new_tarval_from_long(0, mode);
650 vrp->range_bottom = get_tarval_top();
651 vrp->range_top = get_tarval_top();
654 vrp->bits_set = get_tarval_bad();
655 vrp->bits_not_set = get_tarval_bad();
656 vrp->range_bottom = get_tarval_bad();
657 vrp->range_top = get_tarval_bad();
659 vrp->bits_node = NULL;
660 vrp->range_node = NULL;
661 vrp->range_op = VRP_NONE;
663 /* TODO: We might be able to set better vrp info at this time, if this is
664 * a node which is newly created in an already initalized irg
666 * maybe just call vrp_update_node and if it returns one, iterate over
672 void set_vrp_data(ir_graph *irg)
675 ir_node *succ, *node;
677 struct vrp_env_t *env;
685 assure_irg_outs(irg); /* ensure that out edges are consistent*/
686 if (!(phase = get_irg_phase(irg, PHASE_VRP))) {
687 /* this is our first run */
688 phase = init_irg_phase(irg, PHASE_VRP, 0, vrp_init_node);
689 env = phase_alloc(phase, sizeof(struct vrp_env_t));
695 env->workqueue = new_waitq();
698 irg_walk_graph(irg, NULL, vrp_first_pass, env);
700 /* while there are entries in the worklist, continue*/
701 while (!waitq_empty(env->workqueue)) {
702 node = waitq_get(env->workqueue);
704 if (vrp_update_node(node)) {
705 /* if something changed, add successors to worklist*/
706 for (i = get_irn_n_outs(node) - 1; i >=0; --i) {
707 succ = get_irn_out(node, i);
708 waitq_put(env->workqueue, node);
712 del_waitq(env->workqueue);
716 ir_graph_pass_t *set_vrp_pass(const char *name)
718 return def_graph_pass(name ? name : "set_vrp", set_vrp_data);
721 pn_Cmp vrp_cmp(const ir_node *left, const ir_node *right)
723 vrp_attr *vrp_left, *vrp_right;
725 vrp_left = vrp_get_info(left);
726 vrp_right = vrp_get_info(right);
728 if (!vrp_left || !vrp_right) {
732 if (vrp_left->range_type == VRP_RANGE && vrp_right->range_type == VRP_RANGE) {
733 if (tarval_cmp(vrp_left->range_top, vrp_right->range_bottom) == pn_Cmp_Lt) {
736 if (tarval_cmp(vrp_left->range_bottom, vrp_right->range_top) == pn_Cmp_Gt) {
741 if (!tarval_is_null(tarval_and(vrp_left->bits_set, vrp_right->bits_not_set)) ||
742 !tarval_is_null(tarval_and(vrp_left->bits_not_set, vrp_right->bits_set))) {
745 /* TODO: We can get way more information here*/
750 vrp_attr *vrp_get_info(const ir_node *n) {
751 ir_graph *irg = get_irn_irg(n);
752 ir_phase *phase = get_irg_phase(irg, PHASE_VRP);
756 /* phase has not yet been initialized */
760 return phase_get_irn_data(phase, n);