From 81a55f55dabdb89bd9bedbd8b95c34a393b2e364 Mon Sep 17 00:00:00 2001 From: Zhenqiang Chen Date: Mon, 3 Nov 2014 03:20:30 +0000 Subject: [PATCH] ifcvt.c (noce_emit_cmove, [...]): Allow CC mode if HAVE_cbranchcc4. 2014-11-03 Zhenqiang Chen * ifcvt.c (noce_emit_cmove, noce_get_alt_condition, noce_get_condition): Allow CC mode if HAVE_cbranchcc4. From-SVN: r217026 --- gcc/ChangeLog | 5 +++++ gcc/ifcvt.c | 24 ++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9aa585ed1ab..cdf55e13a36 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-11-03 Zhenqiang Chen + + * ifcvt.c (noce_emit_cmove, noce_get_alt_condition, noce_get_condition): + Allow CC mode if HAVE_cbranchcc4. + 2014-11-02 Richard Sandiford * config/arc/arc.c (write_ext_corereg_1): Delete. diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 772b1841584..f8ea467111b 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. */ -- 2.30.2