diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/s390/s390.md | 3 | ||||
-rw-r--r-- | gcc/rtl.h | 1 | ||||
-rw-r--r-- | gcc/rtlanal.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/pr88083.c | 9 |
6 files changed, 39 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee2d87d..7589326 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 7a556d4..721222d 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -941,7 +941,8 @@ (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))) @@ -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. */ diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 9220cbf..11e9664 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 31540b5..32a523e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..d5e530e --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/pr88083.c @@ -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" } */ +} |