From 315adedaf3f2072b55095f101d7df04c39d4e3ae Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Fri, 27 Nov 2009 15:35:50 +0000 Subject: [PATCH] re PR rtl-optimization/42084 (Wrong result with -Os -fno-delete-null-pointer-checks) 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. testsuite/ * gcc.dg/pr42084.c: New test. From-SVN: r154709 --- gcc/ChangeLog | 7 +++++++ gcc/cfgexpand.c | 12 ++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr42084.c | 22 ++++++++++++++++++++++ 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr42084.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73b15a842d8e..8165df587af3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-11-27 Michael Matz + + 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 PR target/41810 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index d3637a02548f..95f694855000 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 39c89bcc0128..d0532ff65563 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-11-27 Michael Matz + + PR rtl-optimization/42084 + * gcc.dg/pr42084.c: New test. + 2009-11-27 Michael Matz PR c++/41906 diff --git a/gcc/testsuite/gcc.dg/pr42084.c b/gcc/testsuite/gcc.dg/pr42084.c new file mode 100644 index 000000000000..d5aad9642cc0 --- /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; +}