Set the outs to inconsistent at the end of transform_irg().
[libfirm] / ir / tv / tv.c
index 766f92f..e4e37da 100644 (file)
@@ -193,8 +193,8 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode)
        case irms_reference:
                /* addresses always wrap around */
                temp = alloca(sc_get_buffer_length());
-               sc_val_from_ulong(-1, temp);
-               sc_and(temp, value, temp);
+               memcpy(temp, value, sc_get_buffer_length());
+               sc_truncate(get_mode_size_bits(mode), temp);
                /* the sc_ module expects that all bits are set ... */
                sign_extend(temp, mode);
                return get_tarval(temp, length, mode);
@@ -206,8 +206,8 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode)
                                return get_mode_max(mode);
                        case TV_OVERFLOW_WRAP:
                                temp = alloca(sc_get_buffer_length());
-                               sc_val_from_ulong(-1, temp);
-                               sc_and(temp, value, temp);
+                               memcpy(temp, value, sc_get_buffer_length());
+                               sc_truncate(get_mode_size_bits(mode), temp);
                                /* the sc_ module expects that all bits are set ... */
                                sign_extend(temp, mode);
                                return get_tarval(temp, length, mode);
@@ -223,8 +223,8 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode)
                                return get_mode_min(mode);
                        case TV_OVERFLOW_WRAP: {
                                char *temp = alloca(sc_get_buffer_length());
-                               sc_val_from_ulong(-1, temp);
-                               sc_and(temp, value, temp);
+                               memcpy(temp, value, sc_get_buffer_length());
+                               sc_truncate(get_mode_size_bits(mode), temp);
                                return get_tarval(temp, length, mode);
                        }
                        case TV_OVERFLOW_BAD:
@@ -524,13 +524,13 @@ tarval *get_tarval_null(ir_mode *mode) {
        case irms_control_flow:
        case irms_memory:
        case irms_auxiliary:
-       case irms_internal_boolean:
                assert(0);
                break;
 
        case irms_float_number:
                return new_tarval_from_double(0.0, mode);
 
+       case irms_internal_boolean:
        case irms_int_number:
                return new_tarval_from_long(0l,  mode);
 
@@ -741,18 +741,24 @@ int tarval_is_negative(tarval *a) {
  * test if null, 1 means 'yes'
  */
 int tarval_is_null(tarval *a) {
-       ir_mode *m = get_tarval_mode(a);
-
-       return a == get_tarval_null(m);
+       return
+               a != tarval_bad &&
+               a == get_tarval_null(get_tarval_mode(a));
 }
 
 /*
  * test if one, 1 means 'yes'
  */
 int tarval_is_one(tarval *a) {
-       ir_mode *m = get_tarval_mode(a);
+       return
+               a != tarval_bad &&
+               a == get_tarval_one(get_tarval_mode(a));
+}
 
-       return a == get_tarval_one(m);
+int tarval_is_all_one(tarval *tv) {
+       return
+               tv != tarval_bad &&
+               tv == get_mode_all_one(get_tarval_mode(tv));
 }
 
 /*
@@ -1571,28 +1577,6 @@ const tarval_mode_info *get_tarval_mode_output_option(ir_mode *mode) {
        return mode->tv_priv;
 }
 
-/*
- * Identifying tarvals values for algebraic simplifications.
- *
- * Returns:
- *   - TV_CLASSIFY_NULL    for additive neutral or the NULL tarval for reference modes,
- *   - TV_CLASSIFY_ONE     for multiplicative neutral,
- *   - TV_CLASSIFY_ALL_ONE for bitwise-and neutral
- *   - TV_CLASSIFY_OTHER   else
- */
-tarval_classification_t classify_tarval(tarval *tv) {
-       if (!tv || tv == tarval_bad) return TV_CLASSIFY_OTHER;
-
-       if (tv == get_mode_null(tv->mode))
-               return TV_CLASSIFY_NULL;
-       else if (tv == get_mode_one(tv->mode))
-               return TV_CLASSIFY_ONE;
-       else if (tv == get_mode_all_one(tv->mode))
-               return TV_CLASSIFY_ALL_ONE;
-
-       return TV_CLASSIFY_OTHER;
-}
-
 /*
  * Returns non-zero if a given (integer) tarval has only one single bit
  * set.