From: Richard Henderson Date: Sun, 30 Jan 2005 02:33:27 +0000 (-0800) Subject: re PR middle-end/19689 (ICE in store_bit_field, at expmed.c) X-Git-Tag: releases/gcc-4.0.0~1189 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8d74033081ff4815c2ff92dd8371c650d7bd1b7c;p=thirdparty%2Fgcc.git re PR middle-end/19689 (ICE in store_bit_field, at expmed.c) PR middle-end/19689 * expr.c (store_field): Don't strip sub-mode cast when the input data is even smaller. From-SVN: r94429 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3bcde399f8a..c56c728da91c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-01-29 Richard Henderson + + PR middle-end/19689 + * expr.c (store_field): Don't strip sub-mode cast when the input + data is even smaller. + 2005-01-29 Richard Henderson PR middle-end/19687 diff --git a/gcc/expr.c b/gcc/expr.c index 29acbba5c5bb..ab7cf930d8b9 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5226,12 +5226,18 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, the field we're storing into, that mask is redundant. This is particularly common with bit field assignments generated by the C front end. */ - if (TREE_CODE (exp) == NOP_EXPR - && INTEGRAL_TYPE_P (TREE_TYPE (exp)) - && (TYPE_PRECISION (TREE_TYPE (exp)) - < GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp)))) - && bitsize == TYPE_PRECISION (TREE_TYPE (exp))) - exp = TREE_OPERAND (exp, 0); + if (TREE_CODE (exp) == NOP_EXPR) + { + tree type = TREE_TYPE (exp); + if (INTEGRAL_TYPE_P (type) + && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type)) + && bitsize == TYPE_PRECISION (type)) + { + type = TREE_TYPE (TREE_OPERAND (exp, 0)); + if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) >= bitsize) + exp = TREE_OPERAND (exp, 0); + } + } temp = expand_expr (exp, NULL_RTX, VOIDmode, 0); diff --git a/gcc/testsuite/gcc.c-torture/execute/pr19689.c b/gcc/testsuite/gcc.c-torture/execute/pr19689.c new file mode 100644 index 000000000000..608415f3693a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr19689.c @@ -0,0 +1,19 @@ +extern void abort (void); + +struct +{ + int b : 29; +} f; + +void foo (short j) +{ + f.b = j; +} + +int main() +{ + foo (-55); + if (f.b != -55) + abort (); + return 0; +}