Combine can change basic blocks in a way that they end up containing
a single jump_insn. This creates an opportunity to improve code with
jump threading.

gcc/ChangeLog:

2018-08-28  Ilya Leoshkevich  <i...@linux.ibm.com>

        PR target/80080
        * cfgcleanup.c: Make jump pass clonable.
        * config/s390/s390-passes.def (INSERT_PASS_AFTER): Perform jump
        threading after combine.

gcc/testsuite/ChangeLog:

2018-08-28  Ilya Leoshkevich  <i...@linux.ibm.com>

        PR target/80080
        * gcc.target/s390/pr80080-4.c: New test.
---
 gcc/cfgcleanup.c                          |  1 +
 gcc/config/s390/s390-passes.def           |  1 +
 gcc/testsuite/gcc.target/s390/pr80080-4.c | 16 ++++++++++++++++
 3 files changed, 18 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/s390/pr80080-4.c

diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 4a5dc29d14f..35aa9f0ac4a 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -3234,6 +3234,7 @@ public:
   {}
 
   /* opt_pass methods: */
+  virtual opt_pass *clone () { return new pass_jump (m_ctxt); }
   virtual unsigned int execute (function *);
 
 }; // class pass_jump
diff --git a/gcc/config/s390/s390-passes.def b/gcc/config/s390/s390-passes.def
index 035c6e8bc0a..2e9b208553e 100644
--- a/gcc/config/s390/s390-passes.def
+++ b/gcc/config/s390/s390-passes.def
@@ -17,4 +17,5 @@ You should have received a copy of the GNU General Public 
License
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
+INSERT_PASS_AFTER (pass_combine, 1, pass_jump);
 INSERT_PASS_BEFORE (pass_thread_prologue_and_epilogue, 1, 
pass_s390_early_mach);
diff --git a/gcc/testsuite/gcc.target/s390/pr80080-4.c 
b/gcc/testsuite/gcc.target/s390/pr80080-4.c
new file mode 100644
index 00000000000..91d31ec7845
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/pr80080-4.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-march=z196 -O2" } */
+
+extern void bar(int *mem);
+
+void foo4(int *mem)
+{
+  int oldval = 0;
+  if (!__atomic_compare_exchange_n (mem, (void *) &oldval, 1,
+                                   1, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED))
+    {
+      bar (mem);
+    }
+}
+
+/* { dg-final { scan-assembler 
"\n\tlt\t.*\n\tjne\t(\\.L\\d+)\n(.*\n)*\tcs\t.*\n\tber\t%r14\n\\1:\n\tjg\tbar\n"
 } } */
-- 
2.18.0

Reply via email to