From: Jakub Jelinek Date: Thu, 19 Aug 2010 17:43:50 +0000 (+0200) Subject: re PR target/45336 (pextr{b,w,d}, (worse than) redundant extensions) X-Git-Tag: releases/gcc-4.6.0~4925 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5d8253f7aba67d7a3e05c5e0e361c9057bc5d54;p=thirdparty%2Fgcc.git re PR target/45336 (pextr{b,w,d}, (worse than) redundant extensions) PR target/45336 * simplify-rtx.c (simplify_unary_operation_1): Optimize nested SIGN_EXTENDs or ZERO_EXTENDs. From-SVN: r163384 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3065cc260f51..518aba1e49aa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-19 Jakub Jelinek + + PR target/45336 + * simplify-rtx.c (simplify_unary_operation_1): Optimize nested + SIGN_EXTENDs or ZERO_EXTENDs. + 2010-08-19 Bernd Schmidt PR target/42172 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index a7a91e5d50f8..e3acc41a9e3c 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -1010,6 +1010,31 @@ simplify_unary_operation_1 (enum rtx_code code, enum machine_mode mode, rtx op) && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0)))) return rtl_hooks.gen_lowpart_no_emit (mode, op); + /* (sign_extend:M (sign_extend:N )) is (sign_extend:M ). */ + if (GET_CODE (op) == SIGN_EXTEND) + return simplify_gen_unary (SIGN_EXTEND, mode, XEXP (op, 0), + GET_MODE (XEXP (op, 0))); + + /* (sign_extend:M (ashiftrt:N (ashift (const_int I)) (const_int I))) + is (sign_extend:M (subreg:O )) if there is mode with + GET_MODE_BITSIZE (N) - I bits. */ + if (GET_CODE (op) == ASHIFTRT + && GET_CODE (XEXP (op, 0)) == ASHIFT + && CONST_INT_P (XEXP (op, 1)) + && XEXP (XEXP (op, 0), 1) == XEXP (op, 1) + && GET_MODE_BITSIZE (GET_MODE (op)) > INTVAL (XEXP (op, 1))) + { + enum machine_mode tmode + = mode_for_size (GET_MODE_BITSIZE (GET_MODE (op)) + - INTVAL (XEXP (op, 1)), MODE_INT, 1); + if (tmode != BLKmode) + { + rtx inner = + rtl_hooks.gen_lowpart_no_emit (tmode, XEXP (XEXP (op, 0), 0)); + return simplify_gen_unary (SIGN_EXTEND, mode, inner, tmode); + } + } + #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend) /* As we do not know which address space the pointer is refering to, we can do this only if the target does not support different pointer @@ -1036,6 +1061,11 @@ simplify_unary_operation_1 (enum rtx_code code, enum machine_mode mode, rtx op) && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0)))) return rtl_hooks.gen_lowpart_no_emit (mode, op); + /* (zero_extend:M (zero_extend:N )) is (zero_extend:M ). */ + if (GET_CODE (op) == ZERO_EXTEND) + return simplify_gen_unary (ZERO_EXTEND, mode, XEXP (op, 0), + GET_MODE (XEXP (op, 0))); + #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend) /* As we do not know which address space the pointer is refering to, we can do this only if the target does not support different pointer