aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2017-04-07 16:01:50 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2017-04-07 16:01:50 +0000
commit057da7af80d2fca356032c22efefcaf50d04da8b (patch)
tree1440f552945d7e20bb953c464d47bae09d44299b
parente3d1043293beed1696e6cb68f19d3bd6fb44c3b0 (diff)
downloadgcc-057da7af80d2fca356032c22efefcaf50d04da8b.zip
gcc-057da7af80d2fca356032c22efefcaf50d04da8b.tar.gz
gcc-057da7af80d2fca356032c22efefcaf50d04da8b.tar.bz2
re PR rtl-optimization/70478 ([LRA] S/390: Performance regression - superfluous stack frame)
2017-04-07 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/70478 * lra-constraints.c (process_alt_operands): Disfavor alternative insn memory operands. 2017-04-07 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/70478 * gcc.target/s390/pr70478.c: New. From-SVN: r246764
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lra-constraints.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/s390/pr70478.c8
4 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d68f161..437c99d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-04-07 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/70478
+ * lra-constraints.c (process_alt_operands): Disfavor alternative
+ insn memory operands.
+
2017-04-07 Jeff Law <law@redhat.com>
* config/iq2000/iq2000.c (final_prescan_insn): Do not separate a
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 4d98624..9440205 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -2685,6 +2685,21 @@ process_alt_operands (int only_alternative)
}
}
+ /* When we use memory operand, the insn should read the
+ value from memory and even if we just wrote a value
+ into the memory it is costly in comparison with an
+ insn alternative which does not use memory
+ (e.g. register or immediate operand). */
+ if (no_regs_p && offmemok)
+ {
+ if (lra_dump_file != NULL)
+ fprintf
+ (lra_dump_file,
+ " Using memory insn operand %d: reject+=3\n",
+ nop);
+ reject += 3;
+ }
+
#ifdef SECONDARY_MEMORY_NEEDED
/* If reload requires moving value through secondary
memory, it will need one more insn at least. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8b5a580..94fe5a0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-04-07 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/70478
+ * gcc.target/s390/pr70478.c: New.
+
2017-04-07 Martin Liska <mliska@suse.cz>
PR target/79889
diff --git a/gcc/testsuite/gcc.target/s390/pr70478.c b/gcc/testsuite/gcc.target/s390/pr70478.c
new file mode 100644
index 0000000..a1f135c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/pr70478.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-w -O3 -march=z9-109" } */
+/* { dg-final { scan-assembler-not "stg" } } */
+
+void foo(unsigned int *a, unsigned char *b)
+{
+ *a &= *b;
+}