diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-01-09 08:21:21 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-01-09 08:21:21 +0100 |
commit | b59e0455e1ecaa3183b9c9c8b56286b39c35ee55 (patch) | |
tree | 7e5acf9afd4878e132bc81f2bc999e0067bd8c1d /gcc | |
parent | 650c4c8531379e3dc60129344d466bcc03abed8b (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 17 | ||||
-rw-r--r-- | gcc/ifcvt.c | 5 |
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); |