From 8d74033081ff4815c2ff92dd8371c650d7bd1b7c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 29 Jan 2005 18:33:27 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/expr.c | 18 ++++++++++++------ gcc/testsuite/gcc.c-torture/execute/pr19689.c | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr19689.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3bcde399f8..c56c728da91 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 29acbba5c5b..ab7cf930d8b 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 00000000000..608415f3693 --- /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; +} -- 2.30.2