aboutsummaryrefslogtreecommitdiff
path: root/gcc/ifcvt.c
diff options
context:
space:
mode:
authorZhenqiang Chen <zhenqiang.chen@arm.com>2014-11-03 03:20:30 +0000
committerZhenqiang Chen <zqchen@gcc.gnu.org>2014-11-03 03:20:30 +0000
commit81a55f55dabdb89bd9bedbd8b95c34a393b2e364 (patch)
tree963276b41d6c1074dc9c30b6baeecfdd8d362756 /gcc/ifcvt.c
parentafc449e82cb99424361f95190cec4381e4da11f8 (diff)
downloadgcc-81a55f55dabdb89bd9bedbd8b95c34a393b2e364.zip
gcc-81a55f55dabdb89bd9bedbd8b95c34a393b2e364.tar.gz
gcc-81a55f55dabdb89bd9bedbd8b95c34a393b2e364.tar.bz2
ifcvt.c (noce_emit_cmove, [...]): Allow CC mode if HAVE_cbranchcc4.
2014-11-03 Zhenqiang Chen <zhenqiang.chen@arm.com> * ifcvt.c (noce_emit_cmove, noce_get_alt_condition, noce_get_condition): Allow CC mode if HAVE_cbranchcc4. From-SVN: r217026
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r--gcc/ifcvt.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 772b184..f8ea467 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -1448,10 +1448,17 @@ noce_emit_cmove (struct noce_if_info *if_info, rtx x, enum rtx_code code,
end_sequence ();
}
- /* Don't even try if the comparison operands are weird. */
+ /* Don't even try if the comparison operands are weird
+ except that the target supports cbranchcc4. */
if (! general_operand (cmp_a, GET_MODE (cmp_a))
|| ! general_operand (cmp_b, GET_MODE (cmp_b)))
- return NULL_RTX;
+ {
+#if HAVE_cbranchcc4
+ if (GET_MODE_CLASS (GET_MODE (cmp_a)) != MODE_CC
+ || cmp_b != const0_rtx)
+#endif
+ return NULL_RTX;
+ }
#if HAVE_conditional_move
unsignedp = (code == LTU || code == GEU
@@ -1777,6 +1784,11 @@ noce_get_alt_condition (struct noce_if_info *if_info, rtx target,
rtx cond, set;
rtx_insn *insn;
int reverse;
+ int allow_cc_mode = false;
+#if HAVE_cbranchcc4
+ allow_cc_mode = true;
+#endif
+
/* If target is already mentioned in the known condition, return it. */
if (reg_mentioned_p (target, if_info->cond))
@@ -1898,7 +1910,7 @@ noce_get_alt_condition (struct noce_if_info *if_info, rtx target,
}
cond = canonicalize_condition (if_info->jump, cond, reverse,
- earliest, target, false, true);
+ earliest, target, allow_cc_mode, true);
if (! cond || ! reg_mentioned_p (target, cond))
return NULL;
@@ -2354,6 +2366,10 @@ noce_get_condition (rtx_insn *jump, rtx_insn **earliest, bool then_else_reversed
{
rtx cond, set, tmp;
bool reverse;
+ int allow_cc_mode = false;
+#if HAVE_cbranchcc4
+ allow_cc_mode = true;
+#endif
if (! any_condjump_p (jump))
return NULL_RTX;
@@ -2390,7 +2406,7 @@ noce_get_condition (rtx_insn *jump, rtx_insn **earliest, bool then_else_reversed
/* Otherwise, fall back on canonicalize_condition to do the dirty
work of manipulating MODE_CC values and COMPARE rtx codes. */
tmp = canonicalize_condition (jump, cond, reverse, earliest,
- NULL_RTX, false, true);
+ NULL_RTX, allow_cc_mode, true);
/* We don't handle side-effects in the condition, like handling
REG_INC notes and making sure no duplicate conditions are emitted. */