aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-01-09 08:21:21 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-01-09 08:21:21 +0100
commitb59e0455e1ecaa3183b9c9c8b56286b39c35ee55 (patch)
tree7e5acf9afd4878e132bc81f2bc999e0067bd8c1d
parent650c4c8531379e3dc60129344d466bcc03abed8b (diff)
downloadgcc-b59e0455e1ecaa3183b9c9c8b56286b39c35ee55.zip
gcc-b59e0455e1ecaa3183b9c9c8b56286b39c35ee55.tar.gz
gcc-b59e0455e1ecaa3183b9c9c8b56286b39c35ee55.tar.bz2
re PR rtl-optimization/59724 (ICE : in rtl_verify_bb_layout, at cfgrtl.c)
PR rtl-optimization/59724 * ifcvt.c (cond_exec_process_if_block): Don't call flow_find_head_matching_sequence with 0 longest_match. * cfgcleanup.c (flow_find_head_matching_sequence): Count even non-active insns if !stop_after. (try_head_merge_bb): Revert 2014-01-07 changes. From-SVN: r206456
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cfgcleanup.c17
-rw-r--r--gcc/ifcvt.c5
3 files changed, 24 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e4872f2..7c691d2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2014-01-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/59724
+ * ifcvt.c (cond_exec_process_if_block): Don't call
+ flow_find_head_matching_sequence with 0 longest_match.
+ * cfgcleanup.c (flow_find_head_matching_sequence): Count even
+ non-active insns if !stop_after.
+ (try_head_merge_bb): Revert 2014-01-07 changes.
+
2014-01-08 Jeff Law <law@redhat.com>
* ree.c (get_sub_rtx): New function, extracted from...
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 028f828..77196ee 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -1421,7 +1421,8 @@ flow_find_cross_jump (basic_block bb1, basic_block bb2, rtx *f1, rtx *f2,
/* Like flow_find_cross_jump, except start looking for a matching sequence from
the head of the two blocks. Do not include jumps at the end.
If STOP_AFTER is nonzero, stop after finding that many matching
- instructions. */
+ instructions. If STOP_AFTER is zero, count all INSN_P insns, if it is
+ non-zero, only count active insns. */
int
flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx *f1,
@@ -1493,7 +1494,7 @@ flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx *f1,
beforelast1 = last1, beforelast2 = last2;
last1 = i1, last2 = i2;
- if (active_insn_p (i1))
+ if (!stop_after || active_insn_p (i1))
ninsns++;
}
@@ -2408,7 +2409,9 @@ try_head_merge_bb (basic_block bb)
max_match--;
if (max_match == 0)
return false;
- e0_last_head = prev_active_insn (e0_last_head);
+ do
+ e0_last_head = prev_real_insn (e0_last_head);
+ while (DEBUG_INSN_P (e0_last_head));
}
if (max_match == 0)
@@ -2428,14 +2431,16 @@ try_head_merge_bb (basic_block bb)
basic_block merge_bb = EDGE_SUCC (bb, ix)->dest;
rtx head = BB_HEAD (merge_bb);
- if (!active_insn_p (head))
- head = next_active_insn (head);
+ while (!NONDEBUG_INSN_P (head))
+ head = NEXT_INSN (head);
headptr[ix] = head;
currptr[ix] = head;
/* Compute the end point and live information */
for (j = 1; j < max_match; j++)
- head = next_active_insn (head);
+ do
+ head = NEXT_INSN (head);
+ while (!NONDEBUG_INSN_P (head));
simulate_backwards_to_point (merge_bb, live, head);
IOR_REG_SET (live_union, live);
}
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 0afcfc3..5129365 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -522,7 +522,10 @@ cond_exec_process_if_block (ce_if_block * ce_info,
n_insns -= 2 * n_matching;
}
- if (then_start && else_start)
+ if (then_start
+ && else_start
+ && then_n_insns > n_matching
+ && else_n_insns > n_matching)
{
int longest_match = MIN (then_n_insns - n_matching,
else_n_insns - n_matching);