diff options
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index a9026636e3e..bbb7135aa75 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -8956,13 +8956,13 @@ merge_outer_ops (enum rtx_code *pop0, HOST_WIDE_INT *pconst0, enum rtx_code op1, && op0 == AND) op0 = UNKNOWN; + *pop0 = op0; + /* ??? Slightly redundant with the above mask, but not entirely. Moving this above means we'd have to sign-extend the mode mask for the final test. */ - const0 = trunc_int_for_mode (const0, mode); - - *pop0 = op0; - *pconst0 = const0; + if (op0 != UNKNOWN && op0 != NEG) + *pconst0 = trunc_int_for_mode (const0, mode); return 1; } @@ -9685,7 +9685,8 @@ simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode, if (outer_op != UNKNOWN) { - if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT) + if (GET_RTX_CLASS (outer_op) != RTX_UNARY + && GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT) outer_const = trunc_int_for_mode (outer_const, result_mode); if (outer_op == AND) |