S/390: memset: Avoid overlapping MVC operands between iterations.
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Thu, 5 Jan 2017 09:59:32 +0000 (09:59 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 5 Jan 2017 09:59:32 +0000 (09:59 +0000)
commit587790e60d22605b9b3aa73e7313cc55a6417c30
treeffa2fd7e3106dd480f6f7c2a22f9439a2e9b2ab0
parent6ff92497174e84271f71d1a1ede8a0ec513ee6a7
S/390: memset: Avoid overlapping MVC operands between iterations.

A memset with a value != 0 is currently implemented using the mvc
instruction propagating the first byte through 256 byte blocks.  While
for the first mvc the byte is written with a separate instruction
subsequent MVCs used the last byte of the previous 256 byte block.

Starting with z13 this causes a major performance degradation.  With
this patch we always set the first byte with an mvi or stc in order to
avoid the overlapping of the MVC operands between loop iterations.

On older machines this basically makes no measurable difference so the
patch enables the new behavior for all machine levels in order to make
sure that code built for older machine levels runs well when moved to
a z13.

Bootstrapped and regression tested on s390 and s390x using z900 and z13
as default -march level. No regressions.

gcc/ChangeLog:

2017-01-05  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

* config/s390/s390.c (s390_expand_setmem): Avoid overlapping bytes
between loop iterations.

From-SVN: r244096
gcc/ChangeLog
gcc/config/s390/s390.c