re PR regression/19898 (cris-elf testsuite failure: gcc.c-torture/execute/strlen...
authorHans-Peter Nilsson <hp@axis.com>
Sat, 12 Feb 2005 01:08:33 +0000 (01:08 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Sat, 12 Feb 2005 01:08:33 +0000 (01:08 +0000)
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

gcc/ChangeLog
gcc/config/cris/cris.c

index 71e5b1510552df1d0f7827406d86068aa01eadfb..e70eb8bb461cb63cb08243d6ff0684ff9b8f3e75 100644 (file)
@@ -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.
index 5fc6804af7232e1dc9b16e07adebf11630cb8524..a01fe1ec4d2a8e5eeeb34ae656ee44c0dc441943 100644 (file)
@@ -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;