From 97efb03aed001755fc4536fc8c7e4a9fcd5989cf Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 6 Mar 2008 13:30:10 +0000 Subject: [PATCH] simplify-rtx.c (simplify_subreg): Remove useless shifts from word-extractions out of a multi-word object. 2008-03-06 Paolo Bonzini * simplify-rtx.c (simplify_subreg): Remove useless shifts from word-extractions out of a multi-word object. From-SVN: r132971 --- gcc/ChangeLog | 5 +++++ gcc/simplify-rtx.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62d78221214..f2d65ad415f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-03-06 Paolo Bonzini + + * simplify-rtx.c (simplify_subreg): Remove useless shifts from + word-extractions out of a multi-word object. + 2008-03-06 Richard Guenther * tree.def (BIT_FIELD_REF): Constrain result type and its precision. diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 34392dce48a..44f3ef57473 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -5239,6 +5239,22 @@ simplify_subreg (enum machine_mode outermode, rtx op, return simplify_gen_binary (ASHIFT, outermode, XEXP (XEXP (op, 0), 0), XEXP (op, 1)); + /* Recognize a word extraction from a multi-word subreg. */ + if ((GET_CODE (op) == LSHIFTRT + || GET_CODE (op) == ASHIFTRT) + && SCALAR_INT_MODE_P (outermode) + && GET_MODE_BITSIZE (outermode) >= BITS_PER_WORD + && GET_MODE_BITSIZE (innermode) >= (2 * GET_MODE_BITSIZE (outermode)) + && GET_CODE (XEXP (op, 1)) == CONST_INT + && (INTVAL (XEXP (op, 1)) & (GET_MODE_BITSIZE (outermode) - 1)) == 0 + && byte == subreg_lowpart_offset (outermode, innermode)) + { + int shifted_bytes = INTVAL (XEXP (op, 1)) / BITS_PER_UNIT; + return simplify_gen_subreg (outermode, XEXP (op, 0), innermode, + (WORDS_BIG_ENDIAN + ? byte - shifted_bytes : byte + shifted_bytes)); + } + return NULL_RTX; } -- 2.11.4.GIT