Commit dd0df136 by Ilya Leoshkevich Committed by Ilya Leoshkevich

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
parent 8ced0660
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
......
...@@ -3020,7 +3020,9 @@ s390_decompose_address (rtx addr, struct s390_address *out) ...@@ -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) ...@@ -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;
......
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.
......
/* { 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];
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment