Commit 34a249bc by Ilya Leoshkevich Committed by Ilya Leoshkevich

S/390: Skip LT(G) peephole when literal pool is involved

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
parent dc3221e1
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> 2018-11-20 Richard Biener <rguenther@suse.de>
PR middle-end/83215 PR middle-end/83215
...@@ -941,7 +941,8 @@ ...@@ -941,7 +941,8 @@
(compare (match_dup 0) (match_operand:GPR 1 "const0_operand")))] (compare (match_dup 0) (match_operand:GPR 1 "const0_operand")))]
"s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM
&& GENERAL_REG_P (operands[0]) && GENERAL_REG_P (operands[0])
&& satisfies_constraint_T (operands[2])" && satisfies_constraint_T (operands[2])
&& !contains_constant_pool_address_p (operands[2])"
[(parallel [(parallel
[(set (reg:CCS CC_REGNUM) [(set (reg:CCS CC_REGNUM)
(compare:CCS (match_dup 2) (match_dup 1))) (compare:CCS (match_dup 2) (match_dup 1)))
......
...@@ -3385,6 +3385,7 @@ extern void set_insn_deleted (rtx_insn *); ...@@ -3385,6 +3385,7 @@ extern void set_insn_deleted (rtx_insn *);
extern rtx single_set_2 (const rtx_insn *, const_rtx); extern rtx single_set_2 (const rtx_insn *, const_rtx);
extern bool contains_symbol_ref_p (const_rtx); extern bool contains_symbol_ref_p (const_rtx);
extern bool contains_symbolic_reference_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. */ /* Handle the cheap and common cases inline for performance. */
......
...@@ -6551,6 +6551,20 @@ contains_symbolic_reference_p (const_rtx x) ...@@ -6551,6 +6551,20 @@ contains_symbolic_reference_p (const_rtx x)
return false; 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. */ /* Return true if X contains a thread-local symbol. */
bool bool
......
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> 2018-11-20 Richard Biener <rguenther@suse.de>
PR middle-end/83215 PR middle-end/83215
......
/* { 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" } */
}
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