diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-10-22 08:24:01 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2015-10-22 08:24:01 +0000 |
commit | 7477de01a8c9c4f496d6f4daea90255ec0aad272 (patch) | |
tree | 95ae2b7b6b9c76277353fb75bf90fdfb702956b6 /gcc | |
parent | 597bb9db4ac508410b42b53480451c7b521b8661 (diff) | |
download | gcc-7477de01a8c9c4f496d6f4daea90255ec0aad272.zip gcc-7477de01a8c9c4f496d6f4daea90255ec0aad272.tar.gz gcc-7477de01a8c9c4f496d6f4daea90255ec0aad272.tar.bz2 |
S/390: PR68015 Fix ICE in s390_emit_compare
gcc/ChangeLog:
2015-10-22 Andreas Krebbel <krebbel@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 <krebbel@linux.vnet.ibm.com>
PR target/68015
* gcc.target/s390/pr68015.c: New test.
From-SVN: r229163
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/s390/s390.md | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/pr68015.c | 24 |
4 files changed, 42 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 11116c4..7385acd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-10-22 Andreas Krebbel <krebbel@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. + 2015-10-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> PR target/63304 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/ChangeLog b/gcc/testsuite/ChangeLog index 3bcbe96..4f54df6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-10-22 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + + PR target/68015 + * gcc.target/s390/pr68015.c: New test. + 2015-10-22 Andre Vieira <andre.simoesdiasvieira@arm.com> PR testsuite/67948 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); +} |