From: Richard Kenner Date: Mon, 3 Aug 1992 01:31:25 +0000 (-0400) Subject: (optimize_bit_field_compare): Correct bogus use of types in expressions... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c0b9d4c816db70e263838b57ac803ad3c451fa90;p=gcc.git (optimize_bit_field_compare): Correct bogus use of types in expressions... (optimize_bit_field_compare): Correct bogus use of types in expressions; always do computation in a type wide enough for the result. From-SVN: r1743 --- diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ed3f7ddba38..207c75a8e17 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2178,13 +2178,13 @@ optimize_bit_field_compare (code, compare_type, lhs, rhs) /* If not comparing with constant, just rework the comparison and return. */ return build (code, compare_type, - build (BIT_AND_EXPR, type, - make_bit_field_ref (linner, type, - lnbitsize, lnbitpos, lunsignedp), + build (BIT_AND_EXPR, unsigned_type, + make_bit_field_ref (linner, unsigned_type, + lnbitsize, lnbitpos, 1), mask), - build (BIT_AND_EXPR, type, - make_bit_field_ref (rinner, type, - rnbitsize, rnbitpos, runsignedp), + build (BIT_AND_EXPR, unsigned_type, + make_bit_field_ref (rinner, unsigned_type, + rnbitsize, rnbitpos, 1), mask)); /* Otherwise, we are handling the constant case. See if the constant is too @@ -2233,17 +2233,16 @@ optimize_bit_field_compare (code, compare_type, lhs, rhs) /* Make a new bitfield reference, shift the constant over the appropriate number of bits and mask it with the computed mask (in case this was a signed field). If we changed it, make a new one. */ - lhs = make_bit_field_ref (linner, TREE_TYPE (lhs), lnbitsize, lnbitpos, - lunsignedp); + lhs = make_bit_field_ref (linner, unsigned_type, lnbitsize, lnbitpos, 1); - rhs = fold (build1 (NOP_EXPR, type, - const_binop (BIT_AND_EXPR, - const_binop (LSHIFT_EXPR, - convert (unsigned_type, rhs), - size_int (lbitpos)), mask))); + rhs = fold (const_binop (BIT_AND_EXPR, + const_binop (LSHIFT_EXPR, + convert (unsigned_type, rhs), + size_int (lbitpos)), + mask)); return build (code, compare_type, - build (BIT_AND_EXPR, type, lhs, mask), + build (BIT_AND_EXPR, unsigned_type, lhs, mask), rhs); }