[RTL-ifcvt] PR rtl-optimization/67481: Look more deeply for CCmode sets during if...
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Mon, 28 Sep 2015 08:25:36 +0000 (08:25 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Mon, 28 Sep 2015 08:25:36 +0000 (08:25 +0000)
PR rtl-optimization/67481
* ifcvt.c (contains_ccmode_rtx_p): New function.
(insn_valid_noce_process_p): Use it.

From-SVN: r228195

gcc/ChangeLog
gcc/ifcvt.c

index b3419b62f00ed3b17e38964879dac8d093bbea09..32875dfca7206d76d415b9bf5006cb1d1738477f 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/67481
+       * ifcvt.c (contains_ccmode_rtx_p): New function.
+       (insn_valid_noce_process_p): Use it.
+
 2015-09-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR rtl-optimization/67456
index 2b63216b9dd4e0355a9eb9bcfb5997150b45f3cc..7ab738ec0e2024735015839ad8e952f07a36ec7c 100644 (file)
@@ -1761,6 +1761,19 @@ noce_try_cmove (struct noce_if_info *if_info)
   return FALSE;
 }
 
+/* Return true if X contains a conditional code mode rtx.  */
+
+static bool
+contains_ccmode_rtx_p (rtx x)
+{
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, x, ALL)
+    if (GET_MODE_CLASS (GET_MODE (*iter)) == MODE_CC)
+      return true;
+
+  return false;
+}
+
 /* Helper for bb_valid_for_noce_process_p.  Validate that
    the rtx insn INSN is a single set that does not set
    the conditional register CC and is in general valid for
@@ -1779,6 +1792,7 @@ insn_valid_noce_process_p (rtx_insn *insn, rtx cc)
   /* Currently support only simple single sets in test_bb.  */
   if (!sset
       || !noce_operand_ok (SET_DEST (sset))
+      || contains_ccmode_rtx_p (SET_DEST (sset))
       || !noce_operand_ok (SET_SRC (sset)))
     return false;