OSDN Git Service

* config/m32c/m32c.c (m32c_compare_redundant): Avoid removing
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Jul 2009 20:07:46 +0000 (20:07 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Jul 2009 20:07:46 +0000 (20:07 +0000)
compares that may be indirectly affected by previous instructions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149719 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/m32c/m32c.c

index 3e6a75f..173cabf 100644 (file)
@@ -1,3 +1,8 @@
+2009-07-16  DJ Delorie  <dj@redhat.com>
+
+       * config/m32c/m32c.c (m32c_compare_redundant): Avoid removing
+       compares that may be indirectly affected by previous instructions.
+
 2009-07-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * builtins.c (do_mpc_arg2): New.
index 9672dfa..46dc4dc 100644 (file)
@@ -4167,6 +4167,40 @@ m32c_compare_redundant (rtx cmp, rtx *operands)
 #endif
        return false;
       }
+
+    /* Check for comparisons against memory - between volatiles and
+       aliases, we just can't risk this one.  */
+    if (GET_CODE (operands[0]) == MEM
+       || GET_CODE (operands[0]) == MEM)
+      {
+#if DEBUG_CMP
+       fprintf(stderr, "comparisons with memory:\n");
+       debug_rtx(prev);
+#endif
+       return false;
+      }
+
+    /* Check for PREV changing a register that's used to compute a
+       value in CMP, even if it doesn't otherwise change flags.  */
+    if (GET_CODE (operands[0]) == REG
+       && rtx_referenced_p (SET_DEST (PATTERN (prev)), operands[0]))
+      {
+#if DEBUG_CMP
+       fprintf(stderr, "sub-value affected, op0:\n");
+       debug_rtx(prev);
+#endif
+       return false;
+      }
+    if (GET_CODE (operands[1]) == REG
+       && rtx_referenced_p (SET_DEST (PATTERN (prev)), operands[1]))
+      {
+#if DEBUG_CMP
+       fprintf(stderr, "sub-value affected, op1:\n");
+       debug_rtx(prev);
+#endif
+       return false;
+      }
+
   } while (pflags == FLAGS_N);
 #if DEBUG_CMP
   fprintf(stderr, "previous flag-setting insn:\n");
@@ -4251,7 +4285,7 @@ m32c_output_compare (rtx insn, rtx *operands)
     }
 
 #if DEBUG_CMP
-  fprintf(stderr, "cbranch: cmp needed: `%s'\n", templ);
+  fprintf(stderr, "cbranch: cmp needed: `%s'\n", templ + 1);
 #endif
   return templ + 1;
 }