re PR rtl-optimization/70478 ([LRA] S/390: Performance regression - superfluous stack...
authorVladimir Makarov <vmakarov@redhat.com>
Fri, 7 Apr 2017 16:01:50 +0000 (16:01 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Fri, 7 Apr 2017 16:01:50 +0000 (16:01 +0000)
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

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pr70478.c [new file with mode: 0644]

index d68f161ca17f5febdc13d345dfdfa43918dd4981..437c99dea471f6853104e54744425df730a9f03b 100644 (file)
@@ -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
index 4d986249a6fa6df1ad497d0830395dc3fed23f92..9440205b66b5c4633fcf0ec4afea8c6258f5c238 100644 (file)
@@ -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.  */
index 8b5a5806ea07c046556ead095cc141b06a761ee4..94fe5a04af30625626d53dea77108349167d924b 100644 (file)
@@ -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 (file)
index 0000000..a1f135c
--- /dev/null
@@ -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;
+}