aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2015-11-27 09:52:09 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2015-11-27 09:52:09 +0000
commit4d7b2a8a3b12beac09c5d8f8bcbf43a81296e462 (patch)
tree95ea7519ecb07bb46162b7ae1b5358239d8969b2
parent14af28ba5aa467556c30cf20a8ee27e83590314f (diff)
downloadgcc-4d7b2a8a3b12beac09c5d8f8bcbf43a81296e462.zip
gcc-4d7b2a8a3b12beac09c5d8f8bcbf43a81296e462.tar.gz
gcc-4d7b2a8a3b12beac09c5d8f8bcbf43a81296e462.tar.bz2
[RTL-ifcvt] Reject insns that are multiple_sets
* ifcvt.c (insn_valid_noce_process_p): Reject insn if it satisfies multiple_sets. (noce_try_cmove_arith): Add checking asserts that orig_a and orig_b are not modified by the final modified insns in the basic blocks. From-SVN: r231004
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ifcvt.c5
2 files changed, 10 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9278a0c..4510240 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2015-11-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+ * ifcvt.c (insn_valid_noce_process_p): Reject insn if it satisfies
+ multiple_sets.
+ (noce_try_cmove_arith): Add checking asserts that orig_a and orig_b
+ are not modified by the final modified insns in the basic blocks.
+
+2015-11-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
PR rtl-optimization/68506
* ifcvt.c (noce_try_cmove_arith): Try emitting the else basic block
first if emit_a exists or then_bb modifies 'b'. Reindent if-else
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 8ece873..c995b0f 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -1850,6 +1850,7 @@ insn_valid_noce_process_p (rtx_insn *insn, rtx cc)
{
if (!insn
|| !NONJUMP_INSN_P (insn)
+ || multiple_sets (insn)
|| (cc && set_of (cc, insn)))
return false;
@@ -2176,7 +2177,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info)
swap insn that sets up A with the one that sets up B. If even
that doesn't help, punt. */
- modified_in_a = emit_a != NULL_RTX && modified_in_p (orig_b, emit_a);
+ gcc_checking_assert (!emit_a || !modified_in_p (orig_b, emit_a));
if (tmp_b && then_bb)
{
FOR_BB_INSNS (then_bb, tmp_insn)
@@ -2192,7 +2193,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info)
}
if (emit_a || modified_in_a)
{
- modified_in_b = emit_b != NULL_RTX && modified_in_p (orig_a, emit_b);
+ gcc_checking_assert (!emit_b || !modified_in_p (orig_a, emit_b));
if (tmp_b && else_bb)
{
FOR_BB_INSNS (else_bb, tmp_insn)