aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2018-10-22 08:21:03 +0000
committerIlya Leoshkevich <iii@gcc.gnu.org>2018-10-22 08:21:03 +0000
commit3703b60c903e1cb7629c1a51cda68e53ebd8fbe8 (patch)
treed4a9054a3d48ec4254d08691d58fd33499335cc2 /gcc
parenta48be73babd27c9deabf099b7202643dd447c9dc (diff)
downloadgcc-3703b60c903e1cb7629c1a51cda68e53ebd8fbe8.zip
gcc-3703b60c903e1cb7629c1a51cda68e53ebd8fbe8.tar.gz
gcc-3703b60c903e1cb7629c1a51cda68e53ebd8fbe8.tar.bz2
S/390: Make "b" constraint match literal pool references
Improves the code generation by getting rid of redundant LAs, as seen in the following example: - la %r1,0(%r13) - lg %r4,0(%r1) + lg %r4,0(%r13) Also allows to proceed with the merge of movdi_64 and movdi_larl. Currently LRA decides to spill literal pool references back to the literal pool, because it preliminarily chooses alternatives with CT_MEMORY constraints without calling satisfies_memory_constraint_p (). Later on it notices that the constraint is wrong and fixes it by spilling. The constraint in this case is "b", and the operand is a literal pool reference. There is no reason to reject them. The current behavior was introduced, apparently unintentionally, by https://gcc.gnu.org/ml/gcc-patches/2010-09/msg00812.html The patch affects a little bit more than mentioned in the subject, because it changes s390_loadrelative_operand_p (), which is called not only for checking the "b" constraint. However, the only caller for which it should really not accept literal pool references is s390_check_qrst_address (), so it was changed to explicitly do so. gcc/ChangeLog: 2018-10-22 Ilya Leoshkevich <iii@linux.ibm.com> * config/s390/s390.c (s390_loadrelative_operand_p): Accept literal pool references. (s390_check_qrst_address): Adapt to the new behavior of s390_loadrelative_operand_p (). gcc/testsuite/ChangeLog: 2018-10-22 Ilya Leoshkevich <iii@linux.ibm.com> * gcc.target/s390/litpool-int.c: New test. From-SVN: r265371
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/s390/s390.c9
-rw-r--r--gcc/testsuite/ChangeLog4
3 files changed, 16 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7b1a98b..fe4898c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-10-22 Ilya Leoshkevich <iii@linux.ibm.com>
+
+ * config/s390/s390.c (s390_loadrelative_operand_p): Accept
+ literal pool references.
+ (s390_check_qrst_address): Adapt to the new behavior of
+ s390_loadrelative_operand_p ().
+
2018-10-22 H.J. Lu <hongjiu.lu@intel.com>
PR target/72782
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index ab22c2c..1de1a71 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -3110,8 +3110,7 @@ s390_legitimate_address_without_index_p (rtx op)
Valid addresses are single references or a sum of a reference and a
constant integer. Return these parts in SYMREF and ADDEND. You can
pass NULL in REF and/or ADDEND if you are not interested in these
- values. Literal pool references are *not* considered symbol
- references. */
+ values. */
static bool
s390_loadrelative_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
@@ -3130,7 +3129,7 @@ s390_loadrelative_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
addr = XEXP (addr, 0);
}
- if ((GET_CODE (addr) == SYMBOL_REF && !CONSTANT_POOL_ADDRESS_P (addr))
+ if (GET_CODE (addr) == SYMBOL_REF
|| (GET_CODE (addr) == UNSPEC
&& (XINT (addr, 1) == UNSPEC_GOTENT
|| XINT (addr, 1) == UNSPEC_PLT)))
@@ -3153,6 +3152,7 @@ s390_loadrelative_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
static int
s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
{
+ rtx symref;
struct s390_address addr;
bool decomposed = false;
@@ -3161,7 +3161,8 @@ s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
/* This check makes sure that no symbolic address (except literal
pool references) are accepted by the R or T constraints. */
- if (s390_loadrelative_operand_p (op, NULL, NULL))
+ if (s390_loadrelative_operand_p (op, &symref, NULL)
+ && (!lit_pool_ok || !CONSTANT_POOL_ADDRESS_P (symref)))
return 0;
/* Ensure literal pool references are only accepted if LIT_POOL_OK. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 27d1ab9..bb22d82 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-10-22 Ilya Leoshkevich <iii@linux.ibm.com>
+
+ * gcc.target/s390/litpool-int.c: New test.
+
2018-10-22 H.J. Lu <hongjiu.lu@intel.com>
PR target/72782