s390: Fix AQ and AR constraints
Ensure for AQ and AR constraints that the resulting displacement after adding any positive offset less than the size of the object being referenced is still valid. gcc/ChangeLog: * config/s390/s390.cc (s390_mem_constraint): Check displacement for AQ and AR constraints.
This commit is contained in:
parent
5938e0681c
commit
1a71ff3b89
1 changed files with 12 additions and 0 deletions
|
@ -3689,6 +3689,18 @@ s390_mem_constraint (const char *str, rtx op)
|
|||
if ((reload_completed || reload_in_progress)
|
||||
? !offsettable_memref_p (op) : !offsettable_nonstrict_memref_p (op))
|
||||
return 0;
|
||||
/* offsettable_memref_p ensures only that any positive offset added to
|
||||
the address forms a valid general address. For AQ and AR constraints
|
||||
we also have to verify that the resulting displacement after adding
|
||||
any positive offset less than the size of the object being referenced
|
||||
is still valid. */
|
||||
if (str[1] == 'Q' || str[1] == 'R')
|
||||
{
|
||||
int o = GET_MODE_SIZE (GET_MODE (op)) - 1;
|
||||
rtx tmp = adjust_address (op, QImode, o);
|
||||
if (!s390_check_qrst_address (str[1], XEXP (tmp, 0), true))
|
||||
return 0;
|
||||
}
|
||||
return s390_check_qrst_address (str[1], XEXP (op, 0), true);
|
||||
case 'B':
|
||||
/* Check for non-literal-pool variants of memory constraints. */
|
||||
|
|
Loading…
Add table
Reference in a new issue