diff options
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 5628e24..57f490d 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6484,11 +6484,13 @@ make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos, && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode)) offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode); - /* If this is a constant position, we can move to the desired byte. */ + /* If this is a constant position, we can move to the desired byte. + Be careful not to go beyond the original object. */ if (pos_rtx == 0) { - offset += pos / BITS_PER_UNIT; - pos %= GET_MODE_BITSIZE (wanted_inner_mode); + enum machine_mode bfmode = smallest_mode_for_size (len, MODE_INT); + offset += pos / GET_MODE_BITSIZE (bfmode); + pos %= GET_MODE_BITSIZE (bfmode); } if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN |