Committed to head and GCC 5 branch

gcc/ChangeLog:

2015-10-22  Andreas Krebbel  <kreb...@linux.vnet.ibm.com>

        PR target/68015
        * config/s390/s390.md (mov<mode>cc): Emit compare only if we don't
        already have a comparison result.

gcc/testsuite/ChangeLog:

2015-10-22  Andreas Krebbel  <kreb...@linux.vnet.ibm.com>

        PR target/68015
        * gcc.target/s390/pr68015.c: New test.

diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 1822459..ea65c74 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -6108,8 +6108,13 @@
                          (match_operand:GPR 2 "nonimmediate_operand" "")
                          (match_operand:GPR 3 "nonimmediate_operand" "")))]
   "TARGET_Z196"
-  "operands[1] = s390_emit_compare (GET_CODE (operands[1]),
-                                    XEXP (operands[1], 0), XEXP (operands[1], 
1));")
+{
+  /* Emit the comparison insn in case we do not already have a comparison 
result.  */
+  if (!s390_comparison (operands[1], VOIDmode))
+    operands[1] = s390_emit_compare (GET_CODE (operands[1]),
+                                    XEXP (operands[1], 0),
+                                    XEXP (operands[1], 1));
+})
 
 ; locr, loc, stoc, locgr, locg, stocg
 (define_insn_and_split "*mov<mode>cc"
diff --git a/gcc/testsuite/gcc.target/s390/pr68015.c 
b/gcc/testsuite/gcc.target/s390/pr68015.c
new file mode 100644
index 0000000..b0d1f35
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/pr68015.c
@@ -0,0 +1,24 @@
+/* { dg-compile } */
+/* { dg-options "-O2 -march=z196" } */
+
+extern long useme (long, ...);
+
+void
+foo (void)
+{
+  long secs = useme (41);
+  long utc_secs = useme (42);
+  long h, m;
+
+  utc_secs = useme (42);
+  h = secs / 3600;
+  m = secs / 60;
+  if (utc_secs >= 86400)
+    {
+      m = 59;
+      h--;
+      if (h < 0)
+       h = 23;
+    }
+  useme (h, m);
+}

Reply via email to