From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:59:10 +0000 (+0200) Subject: backport: re PR rtl-optimization/89354 (Combine pass yields wrong code with -O2 and... X-Git-Tag: releases/gcc-7.5.0~252 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=983b12012424c93d06db05acdb283ac895a9dc58;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/89354 (Combine pass yields wrong code with -O2 and -msse2 for 32bit target) Backported from mainline 2019-02-14 Jakub Jelinek 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: r275111 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0acf9e48fe0..2d31992d9bac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2019-02-14 Jakub Jelinek + PR rtl-optimization/89354 + * combine.c (make_extraction): Punt if extraction_mode is narrower + than len bits. + PR tree-optimization/89314 * fold-const.c (fold_binary_loc): Cast strlen argument to const char * before dereferencing it. Formatting fixes. diff --git a/gcc/combine.c b/gcc/combine.c index ee4f1e19c45b..7e9aedb00203 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7638,6 +7638,10 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode)) extraction_mode = mode; + /* Punt if len is too large for extraction_mode. */ + if (len > GET_MODE_PRECISION (extraction_mode)) + return NULL_RTX; + if (!MEM_P (inner)) wanted_inner_mode = wanted_inner_reg_mode; else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a02952c35b2..57e6aa69d90d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2019-02-14 Jakub Jelinek + PR rtl-optimization/89354 + * gcc.dg/pr89354.c: New test. + PR tree-optimization/89314 * gcc.dg/pr89314.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr89354.c b/gcc/testsuite/gcc.dg/pr89354.c new file mode 100644 index 000000000000..85ad52a63bc8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr89354.c @@ -0,0 +1,22 @@ +/* PR rtl-optimization/89354 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-additional-options "-msse2" { target sse2_runtime } } */ + +static unsigned long long q = 0; + +__attribute__((noinline, noclone)) static void +foo (void) +{ + q = (q & ~0x1ffffffffULL) | 0x100000000ULL; +} + +int +main () +{ + __asm volatile ("" : "+m" (q)); + foo (); + if (q != 0x100000000ULL) + __builtin_abort (); + return 0; +}