diff options
Diffstat (limited to 'gcc/cselib.c')
-rw-r--r-- | gcc/cselib.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/cselib.c b/gcc/cselib.c index e93b7a86c3c..c4c77c2c5ef 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -237,7 +237,7 @@ entry_and_rtx_equal_p (const void *entry, const void *x_arg) rtx x = (rtx) x_arg; enum machine_mode mode = GET_MODE (x); - gcc_assert (GET_CODE (x) != CONST_INT + gcc_assert (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_FIXED && (mode != VOIDmode || GET_CODE (x) != CONST_DOUBLE)); if (mode != GET_MODE (v->val_rtx)) @@ -246,6 +246,7 @@ entry_and_rtx_equal_p (const void *entry, const void *x_arg) /* Unwrap X if necessary. */ if (GET_CODE (x) == CONST && (GET_CODE (XEXP (x, 0)) == CONST_INT + || GET_CODE (XEXP (x, 0)) == CONST_FIXED || GET_CODE (XEXP (x, 0)) == CONST_DOUBLE)) x = XEXP (x, 0); @@ -472,6 +473,7 @@ rtx_equal_for_cselib_p (rtx x, rtx y) switch (GET_CODE (x)) { case CONST_DOUBLE: + case CONST_FIXED: return 0; case LABEL_REF: @@ -554,7 +556,7 @@ rtx_equal_for_cselib_p (rtx x, rtx y) static rtx wrap_constant (enum machine_mode mode, rtx x) { - if (GET_CODE (x) != CONST_INT + if (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_FIXED && (GET_CODE (x) != CONST_DOUBLE || GET_MODE (x) != VOIDmode)) return x; gcc_assert (mode != VOIDmode); @@ -618,6 +620,11 @@ cselib_hash_rtx (rtx x, int create) + (unsigned) CONST_DOUBLE_HIGH (x)); return hash ? hash : (unsigned int) CONST_DOUBLE; + case CONST_FIXED: + hash += (unsigned int) code + (unsigned int) GET_MODE (x); + hash += fixed_hash (CONST_FIXED_VALUE (x)); + return hash ? hash : (unsigned int) CONST_FIXED; + case CONST_VECTOR: { int units; @@ -1124,6 +1131,7 @@ cselib_subst_to_values (rtx x) case CONST_DOUBLE: case CONST_VECTOR: case CONST_INT: + case CONST_FIXED: return x; case POST_INC: |