From: segher Date: Mon, 16 Nov 2015 15:51:33 +0000 (+0000) Subject: simplify-rtx: Simplify sign_extend of lshiftrt to zero_extend (PR68330) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d4cf93af5181387141eb8e6d114b94c6f39463a;p=thirdparty%2Fgcc.git simplify-rtx: Simplify sign_extend of lshiftrt to zero_extend (PR68330) Since r230164, in PR68330 combine ends up with a sign_extend of an lshiftrt by some constant, and it does not know to morph that into a zero_extract (the extend will always extend with zeroes). I think it is best to let simplify-rtx always replace such a sign_extend by a zero_extend, after which everything works as expected. 2015-11-15 Segher Boessenkool PR rtl-optimization/68330 * simplify-rtx.c (simplify_unary_operation_1): Simplify SIGN_EXTEND of LSHIFTRT by a non-zero constant integer. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230429 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 020a00cddbed..d318d58633c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-11-16 Segher Boessenkool + + PR rtl-optimization/68330 + * simplify-rtx.c (simplify_unary_operation_1): Simplify SIGN_EXTEND + of LSHIFTRT by a non-zero constant integer. + 2015-11-16 Richard Biener PR tree-optimization/68306 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index c4fc42aebcf2..413d61b17590 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -1462,6 +1462,13 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op) } } + /* (sign_extend:M (lshiftrt:N (const_int I))) is better as + (zero_extend:M (lshiftrt:N (const_int I))) if I is not 0. */ + if (GET_CODE (op) == LSHIFTRT + && CONST_INT_P (XEXP (op, 1)) + && XEXP (op, 1) != const0_rtx) + return simplify_gen_unary (ZERO_EXTEND, mode, op, GET_MODE (op)); + #if defined(POINTERS_EXTEND_UNSIGNED) /* As we do not know which address space the pointer is referring to, we can do this only if the target does not support different pointer