diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -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); |