summaryrefslogtreecommitdiffstats
path: root/gcc/config/m32c/m32c.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/m32c/m32c.c')
-rw-r--r--gcc/config/m32c/m32c.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c
index 9672dfa718a..46dc4dc6639 100644
--- a/gcc/config/m32c/m32c.c
+++ b/gcc/config/m32c/m32c.c
@@ -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;
}
OpenPOWER on IntegriCloud