diff options
author | Dominik Vogt <vogt@linux.vnet.ibm.com> | 2016-12-12 18:23:48 +0000 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2016-12-12 19:23:48 +0100 |
commit | e4d604062535264fd7973c29f3343d1e51951437 (patch) | |
tree | f19df662420b0b99493ed5e8ac17f7c073c29095 /gcc/combine.c | |
parent | fe366b87159c5ac790045b3e578993d5be6bbdfb (diff) | |
download | gcc-e4d604062535264fd7973c29f3343d1e51951437.zip gcc-e4d604062535264fd7973c29f3343d1e51951437.tar.gz gcc-e4d604062535264fd7973c29f3343d1e51951437.tar.bz2 |
combine: Handle mode expanding zero_extracts in change_zero_ext.
Example:
(zero_extract:DI (reg:SI)
(const_int 24)
(const_int 0))
-->
(and:DI (subreg:DI (lshiftrt:SI (reg:SI) (const_int 8))
0)
(const_int 16777215))
2016-12-12 Dominik Vogt <vogt@linux.vnet.ibm.com>
* combine.c (change_zero_ext): Handle mode expanding zero_extracts.
From-SVN: r243578
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index b429453..19851a2 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -11237,18 +11237,24 @@ change_zero_ext (rtx pat) if (GET_CODE (x) == ZERO_EXTRACT && CONST_INT_P (XEXP (x, 1)) && CONST_INT_P (XEXP (x, 2)) - && GET_MODE (XEXP (x, 0)) == mode) + && GET_MODE (XEXP (x, 0)) != VOIDmode + && GET_MODE_PRECISION (GET_MODE (XEXP (x, 0))) + <= GET_MODE_PRECISION (mode)) { + machine_mode inner_mode = GET_MODE (XEXP (x, 0)); + size = INTVAL (XEXP (x, 1)); int start = INTVAL (XEXP (x, 2)); if (BITS_BIG_ENDIAN) - start = GET_MODE_PRECISION (mode) - size - start; + start = GET_MODE_PRECISION (inner_mode) - size - start; if (start) - x = gen_rtx_LSHIFTRT (mode, XEXP (x, 0), GEN_INT (start)); + x = gen_rtx_LSHIFTRT (inner_mode, XEXP (x, 0), GEN_INT (start)); else x = XEXP (x, 0); + if (mode != inner_mode) + x = gen_lowpart_SUBREG (mode, x); } else if (GET_CODE (x) == ZERO_EXTEND && SCALAR_INT_MODE_P (mode) |