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  <jakub@redhat.com>

	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
This commit is contained in:
Jakub Jelinek 2019-08-30 13:59:10 +02:00 committed by Jakub Jelinek
parent ec97cf390e
commit 983b120124
4 changed files with 33 additions and 0 deletions

View File

@ -3,6 +3,10 @@
Backported from mainline
2019-02-14 Jakub Jelinek <jakub@redhat.com>
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.

View File

@ -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

View File

@ -3,6 +3,9 @@
Backported from mainline
2019-02-14 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/89354
* gcc.dg/pr89354.c: New test.
PR tree-optimization/89314
* gcc.dg/pr89314.c: New test.

View File

@ -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;
}