ifcvt.c (HAVE_cbranchcc4): Define.
authorZhenqiang Chen <zhenqiang.chen@arm.com>
Mon, 17 Nov 2014 06:29:07 +0000 (06:29 +0000)
committerZhenqiang Chen <zqchen@gcc.gnu.org>
Mon, 17 Nov 2014 06:29:07 +0000 (06:29 +0000)
2014-11-17  Zhenqiang Chen  <zhenqiang.chen@arm.com>

* ifcvt.c (HAVE_cbranchcc4): Define.
(noce_emit_cmove, noce_get_alt_condition, noce_get_condition):
Use HAVE_cbranchcc4.

From-SVN: r217646

gcc/ChangeLog
gcc/ifcvt.c

index 540784d..bf36bc2 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-17  Zhenqiang Chen  <zhenqiang.chen@arm.com>
+
+       * ifcvt.c (HAVE_cbranchcc4): Define.
+       (noce_emit_cmove, noce_get_alt_condition, noce_get_condition):
+       Use HAVE_cbranchcc4.
+
 2014-11-17  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
        * config/aarch64/aarch64.c (aarch64_code_to_ccmode,
index f4002f9..21f08c2 100644 (file)
    + 1)
 #endif
 
+#ifndef HAVE_cbranchcc4
+#define HAVE_cbranchcc4 0
+#endif
+
 #define IFCVT_MULTIPLE_DUMPS 1
 
 #define NULL_BLOCK     ((basic_block) NULL)
@@ -1459,10 +1463,16 @@ 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)
+         || GET_MODE_CLASS (GET_MODE (cmp_a)) != MODE_CC
+         || cmp_b != const0_rtx)
+       return NULL_RTX;
+    }
 
 #if HAVE_conditional_move
   unsignedp = (code == LTU || code == GEU
@@ -1909,7 +1919,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, HAVE_cbranchcc4, true);
   if (! cond || ! reg_mentioned_p (target, cond))
     return NULL;
 
@@ -2401,7 +2411,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, HAVE_cbranchcc4, true);
 
   /* We don't handle side-effects in the condition, like handling
      REG_INC notes and making sure no duplicate conditions are emitted.  */