aboutsummaryrefslogtreecommitdiff
path: root/gcc/ifcvt.c
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2015-09-28 08:25:36 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2015-09-28 08:25:36 +0000
commit2e73b8fe52035fffbcb666f9017ff06a84dc09cf (patch)
tree08374d69589fda69eed1782b4f0d5fa047e43707 /gcc/ifcvt.c
parent470512c31b5e078519370ce66fb39a3b6d604392 (diff)
downloadgcc-2e73b8fe52035fffbcb666f9017ff06a84dc09cf.zip
gcc-2e73b8fe52035fffbcb666f9017ff06a84dc09cf.tar.gz
gcc-2e73b8fe52035fffbcb666f9017ff06a84dc09cf.tar.bz2
[RTL-ifcvt] PR rtl-optimization/67481: Look more deeply for CCmode sets during if-covnersion
PR rtl-optimization/67481 * ifcvt.c (contains_ccmode_rtx_p): New function. (insn_valid_noce_process_p): Use it. From-SVN: r228195
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r--gcc/ifcvt.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 2b63216..7ab738e 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -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;