S/390: Skip LT(G) peephole when literal pool is involved
authorIlya Leoshkevich <iii@linux.ibm.com>
Tue, 20 Nov 2018 09:32:49 +0000 (09:32 +0000)
committerIlya Leoshkevich <iii@gcc.gnu.org>
Tue, 20 Nov 2018 09:32:49 +0000 (09:32 +0000)
By the time peephole optimizations run, we've already made up our mind
whether to use base-register or relative addressing for literal pool
entries.  LT(G) supports only base-register addressing, and so it is
too late to convert L(G)RL + compare to LT(G).  This change should not
make the code worse unless building with e.g. -fno-dce, since comparing
literal pool entries to zero should be optimized away during earlier
passes.

gcc/ChangeLog:

2018-11-20  Ilya Leoshkevich  <iii@linux.ibm.com>

PR target/88083
* config/s390/s390.md: Skip LT(G) peephole when literal pool is
involved.
* rtl.h (contains_constant_pool_address_p): New function.
* rtlanal.c (contains_constant_pool_address_p): Likewise.

gcc/testsuite/ChangeLog:

2018-11-20  Ilya Leoshkevich  <iii@linux.ibm.com>

PR target/88083
* gcc.target/s390/pr88083.c: New test.

From-SVN: r266306

gcc/ChangeLog
gcc/config/s390/s390.md
gcc/rtl.h
gcc/rtlanal.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pr88083.c [new file with mode: 0644]

index ee2d87d0313f6a97dcbe77b1084c7b96f9ae3a31..75893260d525130a2b2967eb9ec21df67fe98604 100644 (file)
@@ -1,3 +1,11 @@
+2018-11-20  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR target/88083
+       * config/s390/s390.md: Skip LT(G) peephole when literal pool is
+       involved.
+       * rtl.h (contains_constant_pool_address_p): New function.
+       * rtlanal.c (contains_constant_pool_address_p): Likewise.
+
 2018-11-20  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/83215
index 7a556d40224943747516efd719186b7285854c8d..721222d221f4d812fd87319cd76106e1ef923c91 100644 (file)
        (compare (match_dup 0) (match_operand:GPR 1 "const0_operand")))]
   "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM
    && GENERAL_REG_P (operands[0])
-   && satisfies_constraint_T (operands[2])"
+   && satisfies_constraint_T (operands[2])
+   && !contains_constant_pool_address_p (operands[2])"
   [(parallel
     [(set (reg:CCS CC_REGNUM)
          (compare:CCS (match_dup 2) (match_dup 1)))
index 4114cd029918cdf8600e96ba9a35af33f622f0f5..dd3ce06295a167feca001269c3b1711d1f1dbd5f 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3385,6 +3385,7 @@ extern void set_insn_deleted (rtx_insn *);
 extern rtx single_set_2 (const rtx_insn *, const_rtx);
 extern bool contains_symbol_ref_p (const_rtx);
 extern bool contains_symbolic_reference_p (const_rtx);
+extern bool contains_constant_pool_address_p (const_rtx);
 
 /* Handle the cheap and common cases inline for performance.  */
 
index 9220cbf33066ccdeceed9d29deb89927b7ce4fae..11e96642139e75a6f6817bed53c8259d03bc2984 100644 (file)
@@ -6551,6 +6551,20 @@ contains_symbolic_reference_p (const_rtx x)
   return false;
 }
 
+/* Return true if RTL X contains a constant pool address.  */
+
+bool
+contains_constant_pool_address_p (const_rtx x)
+{
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, x, ALL)
+    if (SYMBOL_REF_P (*iter) && CONSTANT_POOL_ADDRESS_P (*iter))
+      return true;
+
+  return false;
+}
+
+
 /* Return true if X contains a thread-local symbol.  */
 
 bool
index 31540b582663b3aa0329b58f6f84cb3dd9f66c39..32a523e27803f6ad54c6108a8a9545063c52d3e4 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-20  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR target/88083
+       * gcc.target/s390/pr88083.c: New test.
+
 2018-11-20  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/83215
diff --git a/gcc/testsuite/gcc.target/s390/pr88083.c b/gcc/testsuite/gcc.target/s390/pr88083.c
new file mode 100644 (file)
index 0000000..d5e530e
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-fno-sched-last-insn-heuristic -fno-dce -march=z196 -O2" } */
+
+void *a, *b;
+
+void c(void)
+{
+  __builtin_memcpy(a, b, -1);  /* { dg-warning "exceeds maximum object size" } */
+}