S/390: Reject invalid Q/R/S/T addresses after LRA

The following insn:

(insn (set (reg:DI %r2)
           (sign_extend:DI (mem:SI
            (const:DI (plus:DI (symbol_ref:DI ("*.LC0"))
                               (const_int 16)))))))

is correctly recognized by LRA as RIL alternative of extendsidi2
define_insn.  However, when recognition runs after LRA, it returns RXY
alternative, which is incorrect, since the offset 16 points past the
end of of *.LC0 literal pool entry.  Such addresses are normally
rejected by s390_decompose_address ().

This inconsistency confuses annotate_constant_pool_refs: the selected
alternative makes it proceed with annotation, only to find that the
annotated address is invalid, causing ICE.

This patch fixes the root cause, namely, that s390_check_qrst_address ()
behaves differently during and after LRA.

gcc/ChangeLog:

2019-02-12  Ilya Leoshkevich  <iii@linux.ibm.com>

	PR target/89233
	* config/s390/s390.c (s390_decompose_address): Update comment.
	(s390_check_qrst_address): Reject invalid address forms after
	LRA.

gcc/testsuite/ChangeLog:

2019-02-12  Ilya Leoshkevich  <iii@linux.ibm.com>

	PR target/89233
	* gcc.target/s390/pr89233.c: New test.

From-SVN: r268798
This commit is contained in:
Ilya Leoshkevich 2019-02-12 14:51:39 +00:00 committed by Ilya Leoshkevich
parent 8ced066037
commit dd0df13685
4 changed files with 30 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2019-02-12 Ilya Leoshkevich <iii@linux.ibm.com>
PR target/89233
* config/s390/s390.c (s390_decompose_address): Update comment.
(s390_check_qrst_address): Reject invalid address forms after
LRA.
2019-02-12 Martin Liska <mliska@suse.cz> 2019-02-12 Martin Liska <mliska@suse.cz>
PR lto/88876 PR lto/88876

View File

@ -3020,7 +3020,9 @@ s390_decompose_address (rtx addr, struct s390_address *out)
if (offset) if (offset)
{ {
/* If we have an offset, make sure it does not /* If we have an offset, make sure it does not
exceed the size of the constant pool entry. */ exceed the size of the constant pool entry.
Otherwise we might generate an out-of-range
displacement for the base register form. */
rtx sym = XVECEXP (disp, 0, 0); rtx sym = XVECEXP (disp, 0, 0);
if (offset >= GET_MODE_SIZE (get_pool_mode (sym))) if (offset >= GET_MODE_SIZE (get_pool_mode (sym)))
return false; return false;
@ -3193,8 +3195,10 @@ s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
generic cases below ('R' or 'T'), since reload will in fact fix generic cases below ('R' or 'T'), since reload will in fact fix
them up. LRA behaves differently here; we never see such forms, them up. LRA behaves differently here; we never see such forms,
but on the other hand, we need to strictly reject every invalid but on the other hand, we need to strictly reject every invalid
address form. Perform this check right up front. */ address form. After both reload and LRA invalid address forms
if (lra_in_progress) must be rejected, because nothing will fix them up later. Perform
this check right up front. */
if (lra_in_progress || reload_completed)
{ {
if (!decomposed && !s390_decompose_address (op, &addr)) if (!decomposed && !s390_decompose_address (op, &addr))
return 0; return 0;

View File

@ -1,3 +1,8 @@
2019-02-12 Ilya Leoshkevich <iii@linux.ibm.com>
PR target/89233
* gcc.target/s390/pr89233.c: New test.
2018-01-12 Bill Schmidt <wschmidt@linux.ibm.com> 2018-01-12 Bill Schmidt <wschmidt@linux.ibm.com>
* gcc.target/powerpc/vec-sld-modulo.c: Require p8vector_hw. * gcc.target/powerpc/vec-sld-modulo.c: Require p8vector_hw.

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-march=z13 -O1" } */
typedef int v4si __attribute__ ((vector_size (16)));
int
f ()
{
v4si x = {0, 1, 2, 3};
return x[4];
}