aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2019-02-15 00:10:47 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-15 00:10:47 +0100
commitdddd0c7a5b751f398cba325dc7310bb185fed201 (patch)
tree41cceb5e2419961df17e3ef8936879161cdc9e6c /gcc/combine.c
parentbf36afbc8f680205f04f75f308b994cff75fd54d (diff)
downloadgcc-dddd0c7a5b751f398cba325dc7310bb185fed201.zip
gcc-dddd0c7a5b751f398cba325dc7310bb185fed201.tar.gz
gcc-dddd0c7a5b751f398cba325dc7310bb185fed201.tar.bz2
re PR rtl-optimization/89354 (Combine pass yields wrong code with -O2 and -msse2 for 32bit target)
PR rtl-optimization/89354 * combine.c (make_extraction): Punt if extraction_mode is narrower than len bits. * gcc.dg/pr89354.c: New test. From-SVN: r268913
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index a249248..91e32c8 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7830,6 +7830,10 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
&& partial_subreg_p (extraction_mode, mode))
extraction_mode = mode;
+ /* Punt if len is too large for extraction_mode. */
+ if (maybe_gt (len, GET_MODE_PRECISION (extraction_mode)))
+ return NULL_RTX;
+
if (!MEM_P (inner))
wanted_inner_mode = wanted_inner_reg_mode;
else