diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cfgexpand.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr42084.c | 22 |
4 files changed, 40 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73b15a8..8165df5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-11-27 Michael Matz <matz@suse.de> + + PR rtl-optimization/42084 + * cfgexpand.c (maybe_cleanup_end_of_block): Add new parameter, + use it to stop walking. + (expand_gimple_cond): Adjust call to above. + 2009-11-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> PR target/41810 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index d3637a0..95f6948 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1586,10 +1586,11 @@ label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED) /* A subroutine of expand_gimple_cond. Given E, a fallthrough edge of a basic block where we just expanded the conditional at the end, - possibly clean up the CFG and instruction sequence. */ + possibly clean up the CFG and instruction sequence. LAST is the + last instruction before the just emitted jump sequence. */ static void -maybe_cleanup_end_of_block (edge e) +maybe_cleanup_end_of_block (edge e, rtx last) { /* Special case: when jumpif decides that the condition is trivial it emits an unconditional jump (and the necessary @@ -1604,7 +1605,6 @@ maybe_cleanup_end_of_block (edge e) normally isn't there in a cleaned CFG), fix it here. */ if (BARRIER_P (get_last_insn ())) { - basic_block bb = e->src; rtx insn; remove_edge (e); /* Now, we have a single successor block, if we have insns to @@ -1620,7 +1620,7 @@ maybe_cleanup_end_of_block (edge e) /* Make sure we have an unconditional jump. Otherwise we're confused. */ gcc_assert (JUMP_P (insn) && !any_condjump_p (insn)); - for (insn = PREV_INSN (insn); insn != BB_HEAD (bb);) + for (insn = PREV_INSN (insn); insn != last;) { insn = PREV_INSN (insn); if (JUMP_P (NEXT_INSN (insn))) @@ -1699,7 +1699,7 @@ expand_gimple_cond (basic_block bb, gimple stmt) } true_edge->goto_block = NULL; false_edge->flags |= EDGE_FALLTHRU; - maybe_cleanup_end_of_block (false_edge); + maybe_cleanup_end_of_block (false_edge, last); return NULL; } if (true_edge->dest == bb->next_bb) @@ -1715,7 +1715,7 @@ expand_gimple_cond (basic_block bb, gimple stmt) } false_edge->goto_block = NULL; true_edge->flags |= EDGE_FALLTHRU; - maybe_cleanup_end_of_block (true_edge); + maybe_cleanup_end_of_block (true_edge, last); return NULL; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39c89bc..d0532ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2009-11-27 Michael Matz <matz@suse.de> + PR rtl-optimization/42084 + * gcc.dg/pr42084.c: New test. + +2009-11-27 Michael Matz <matz@suse.de> + PR c++/41906 * g++.dg/tree-ssa/pr41906.C: New testcase. diff --git a/gcc/testsuite/gcc.dg/pr42084.c b/gcc/testsuite/gcc.dg/pr42084.c new file mode 100644 index 0000000..d5aad96 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42084.c @@ -0,0 +1,22 @@ +/* { dg-do run } */ +/* { dg-options "-O1 -fno-delete-null-pointer-checks" } */ +extern void abort (void); +int g = 0; +static int __attribute__((noinline)) f (long long a, long long b) +{ + int cmp; + cmp = a > b; + if (&g == 0) + cmp-=2; + else + cmp++; + return cmp; +} + +int main (void) +{ + int ret = f (2, 1); + if (ret != 2) + abort (); + return 0; +} |