aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorDominik Vogt <vogt@linux.vnet.ibm.com>2016-12-12 18:23:48 +0000
committerSegher Boessenkool <segher@gcc.gnu.org>2016-12-12 19:23:48 +0100
commite4d604062535264fd7973c29f3343d1e51951437 (patch)
treef19df662420b0b99493ed5e8ac17f7c073c29095 /gcc/combine.c
parentfe366b87159c5ac790045b3e578993d5be6bbdfb (diff)
downloadgcc-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.c12
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)