- new_top = tarval_sub(vrp_left->range_top, vrp_right->range_top, NULL);
- overflow_top = tarval_carry();
- new_bottom = tarval_sub(vrp_left->range_bottom, vrp_right->range_bottom, NULL);
- overflow_bottom = tarval_carry();
-
- if (!overflow_top && !overflow_bottom && vrp_left->range_type == VRP_RANGE
- &&vrp_right->range_type == VRP_RANGE) {
- new_range_bottom = new_bottom;
- new_range_top = new_top;
- new_range_type = VRP_RANGE;
- }
-
- if (overflow_top || overflow_bottom) {
- /* TODO Implement overflow handling*/
+ if (vrp_left->range_type == VRP_RANGE
+ && vrp_right->range_type == VRP_RANGE) {
+ tarval_int_overflow_mode_t rem = tarval_get_integer_overflow_mode();
+ tarval_set_integer_overflow_mode(TV_OVERFLOW_BAD);
+ ir_tarval *new_top = tarval_sub(vrp_left->range_top, vrp_right->range_top, NULL);
+ ir_tarval *new_bottom = tarval_sub(vrp_left->range_bottom, vrp_right->range_bottom, NULL);
+ tarval_set_integer_overflow_mode(rem);
+
+ if (new_top != tarval_bad && new_bottom != tarval_bad) {
+ new_range_bottom = new_bottom;
+ new_range_top = new_top;
+ new_range_type = VRP_RANGE;
+ } else {
+ /* TODO Implement overflow handling*/
+ new_range_type = VRP_UNDEFINED;
+ }