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); +}