re PR rtl-optimization/92176 (LRA problem with reloads for subreg operands)

2019-12-06  Andreas Krebbel  <krebbel@linux.ibm.com>
	    Vladimir Makarov  <vmakarov@redhat.com>

	PR rtl-optimization/92176
	* lra.c (simplify_subreg_regno): Don't permit unconditional
	changing mode for LRA too.

2019-12-06  Andreas Krebbel  <krebbel@linux.ibm.com>
	    Vladimir Makarov  <vmakarov@redhat.com>

	PR rtl-optimization/92176
	* gcc.target/s390/pr92176.c: New test.


Co-Authored-By: Vladimir Makarov <vmakarov@redhat.com>

From-SVN: r279061
This commit is contained in:
Andreas Krebbel 2019-12-06 19:30:37 +00:00 committed by Vladimir Makarov
parent 3ad4a03ac6
commit 1a880ef211
4 changed files with 47 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2019-12-06 Andreas Krebbel <krebbel@linux.ibm.com>
Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/92176
* lra.c (simplify_subreg_regno): Don't permit unconditional
changing mode for LRA too.
2019-12-06 Richard Sandiford <richard.sandiford@arm.com>
* target.h (TCTX_ALLOCATION, TCTX_DEALLOCATION, TCTX_EXCEPTIONS)

View File

@ -3951,9 +3951,7 @@ simplify_subreg_regno (unsigned int xregno, machine_mode xmode,
/* Give the backend a chance to disallow the mode change. */
if (GET_MODE_CLASS (xmode) != MODE_COMPLEX_INT
&& GET_MODE_CLASS (xmode) != MODE_COMPLEX_FLOAT
&& !REG_CAN_CHANGE_MODE_P (xregno, xmode, ymode)
/* We can use mode change in LRA for some transformations. */
&& ! lra_in_progress)
&& !REG_CAN_CHANGE_MODE_P (xregno, xmode, ymode))
return -1;
/* We shouldn't simplify stack-related registers. */

View File

@ -1,3 +1,9 @@
2019-12-06 Andreas Krebbel <krebbel@linux.ibm.com>
Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/92176
* gcc.target/s390/pr92176.c: New test.
2019-12-06 Martin Sebor <msebor@redhat.com>
* gcc.dg/Wstringop-overflow-23.c: Use the correct argument type.

View File

@ -0,0 +1,33 @@
/* { dg-do compile } */
/* { dg-options "-O3 -march=z13 -mzarch" } */
int a = 5, b, c, d, g, h, k, l, m, o;
static int e[7];
int *volatile i = &d;
long long j;
short p(int f, int dummy) {
k = 0 != (*e = m);
j = 0;
for (; j < 59; j = j + 1)
*i |= b;
g = 1;
for (; g <= 4; g++) {
o = 0;
for (; o <= 4; o++)
i = (int * volatile)(long)l;
}
return 42;
}
void
q() {
char *n = (char*)&b;
(*n = a) == p(e[6], c);
for (; h;)
for (;;)
;
}
/* { dg-final { scan-assembler-not {(?n)^\tvsteb\t.+,0$} } } */