From cc3a5b33bae232329f4d02a3a8e391623ceeb5c0 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 29 Apr 2017 18:18:11 +0200 Subject: [PATCH] re PR rtl-optimization/80491 (Compiler regression for long-add case.) PR rtl-optimization/80491 * ifcvt.c (noce_process_if_block): When looking for x setter with missing else_bb, don't check only the insn right before cond_earliest, but look for the last insn that x is modified in within the same bb. From-SVN: r247410 --- gcc/ChangeLog | 6 ++++++ gcc/ifcvt.c | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9a9d192d01a..bb380b325a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2017-04-29 Jakub Jelinek + PR rtl-optimization/80491 + * ifcvt.c (noce_process_if_block): When looking for x setter + with missing else_bb, don't check only the insn right before + cond_earliest, but look for the last insn that x is modified in + within the same bb. + PR rtl-optimization/80491 * alias.c (memory_modified_in_insn_p): Return true for CALL_INSNs. diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index e51ccab26b2..75458589468 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -3440,7 +3440,14 @@ noce_process_if_block (struct noce_if_info *if_info) } else { - insn_b = prev_nonnote_nondebug_insn (if_info->cond_earliest); + insn_b = if_info->cond_earliest; + do + insn_b = prev_nonnote_nondebug_insn (insn_b); + while (insn_b + && (BLOCK_FOR_INSN (insn_b) + == BLOCK_FOR_INSN (if_info->cond_earliest)) + && !modified_in_p (x, insn_b)); + /* We're going to be moving the evaluation of B down from above COND_EARLIEST to JUMP. Make sure the relevant data is still intact. */ -- 2.30.2