diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1992-08-02 21:31:25 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1992-08-02 21:31:25 -0400 |
commit | c0b9d4c816db70e263838b57ac803ad3c451fa90 (patch) | |
tree | 6f6771c8e9b20882f8b6b6a5cf79a72a5486a6de /gcc | |
parent | fde9637ebe4dce2349ce78a751997886feb53d64 (diff) | |
download | gcc-c0b9d4c816db70e263838b57ac803ad3c451fa90.zip gcc-c0b9d4c816db70e263838b57ac803ad3c451fa90.tar.gz gcc-c0b9d4c816db70e263838b57ac803ad3c451fa90.tar.bz2 |
(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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fold-const.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ed3f7dd..207c75a 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); } |