aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2005-02-12 01:08:33 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2005-02-12 01:08:33 +0000
commitf4ddadddf99edb3fd2ec0585c7463278d2f0e70c (patch)
tree7a87f8b19e23ea4b3626c8884af1c2249355ac3d /gcc
parent7e7e470f9bf455553ee08e9be90943fa3631a07b (diff)
downloadgcc-f4ddadddf99edb3fd2ec0585c7463278d2f0e70c.zip
gcc-f4ddadddf99edb3fd2ec0585c7463278d2f0e70c.tar.gz
gcc-f4ddadddf99edb3fd2ec0585c7463278d2f0e70c.tar.bz2
re PR regression/19898 (cris-elf testsuite failure: gcc.c-torture/execute/strlen-1.c execution, -O2 and higher)
PR regression/19898. * config/cris/cris.c (cris_notice_update_cc): When testing if insn changes cc_status, use apply modified_in_p to part of cc_status and insn, not cris_reg_overlap_mentioned_p on SET_DEST of insn body. From-SVN: r94914
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/cris/cris.c50
2 files changed, 20 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 71e5b15..e70eb8b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2005-02-12 Hans-Peter Nilsson <hp@axis.com>
+
+ PR regression/19898.
+ * config/cris/cris.c (cris_notice_update_cc): When testing if insn
+ changes cc_status, use apply modified_in_p to part of cc_status
+ and insn, not cris_reg_overlap_mentioned_p on SET_DEST of insn
+ body.
+
2005-02-11 Richard Henderson <rth@redhat.com>
* tree-complex.c (expand_complex_libcall): New.
diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c
index 5fc6804..a01fe1e 100644
--- a/gcc/config/cris/cris.c
+++ b/gcc/config/cris/cris.c
@@ -1834,13 +1834,11 @@ cris_notice_update_cc (rtx exp, rtx insn)
if (GET_CODE (exp) == SET)
{
if (cc_status.value1
- && cris_reg_overlap_mentioned_p (SET_DEST (exp),
- cc_status.value1))
+ && modified_in_p (cc_status.value1, insn))
cc_status.value1 = 0;
if (cc_status.value2
- && cris_reg_overlap_mentioned_p (SET_DEST (exp),
- cc_status.value2))
+ && modified_in_p (cc_status.value2, insn))
cc_status.value2 = 0;
}
return;
@@ -1970,14 +1968,12 @@ cris_notice_update_cc (rtx exp, rtx insn)
{
/* There's no CC0 change when clearing a register or
memory. Just check for overlap. */
- if ((cc_status.value1
- && cris_reg_overlap_mentioned_p (SET_DEST (exp),
- cc_status.value1)))
+ if (cc_status.value1
+ && modified_in_p (cc_status.value1, insn))
cc_status.value1 = 0;
- if ((cc_status.value2
- && cris_reg_overlap_mentioned_p (SET_DEST (exp),
- cc_status.value2)))
+ if (cc_status.value2
+ && modified_in_p (cc_status.value2, insn))
cc_status.value2 = 0;
return;
@@ -2009,14 +2005,12 @@ cris_notice_update_cc (rtx exp, rtx insn)
{
/* When SET to MEM, then CC is not changed (except for
overlap). */
- if ((cc_status.value1
- && cris_reg_overlap_mentioned_p (SET_DEST (exp),
- cc_status.value1)))
+ if (cc_status.value1
+ && modified_in_p (cc_status.value1, insn))
cc_status.value1 = 0;
- if ((cc_status.value2
- && cris_reg_overlap_mentioned_p (SET_DEST (exp),
- cc_status.value2)))
+ if (cc_status.value2
+ && modified_in_p (cc_status.value2, insn))
cc_status.value2 = 0;
return;
@@ -2053,31 +2047,11 @@ cris_notice_update_cc (rtx exp, rtx insn)
/* For "move.S rz,[rx=ry+o]" and "clear.S [rx=ry+o]",
say flags are not changed, except for overlap. */
if (cc_status.value1
- && cris_reg_overlap_mentioned_p (XEXP
- (XVECEXP
- (exp, 0, 0), 0),
- cc_status.value1))
- cc_status.value1 = 0;
-
- if (cc_status.value1
- && cris_reg_overlap_mentioned_p (XEXP
- (XVECEXP
- (exp, 0, 1), 0),
- cc_status.value1))
+ && modified_in_p (cc_status.value1, insn))
cc_status.value1 = 0;
if (cc_status.value2
- && cris_reg_overlap_mentioned_p (XEXP
- (XVECEXP
- (exp, 0, 0), 0),
- cc_status.value2))
- cc_status.value2 = 0;
-
- if (cc_status.value2
- && cris_reg_overlap_mentioned_p (XEXP
- (XVECEXP
- (exp, 0, 1), 0),
- cc_status.value2))
+ && modified_in_p (cc_status.value2, insn))
cc_status.value2 = 0;
return;