From 169e464e66d4b35e80d66781c6aa53fcc1726f65 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 17 Feb 2010 09:54:59 +0100 Subject: [PATCH] re PR debug/42918 ("-fcompare-debug failure" with "-O2 -ftracer" (2)) PR debug/42918 * caller-save.c (save_call_clobbered_regs): If BB ends with a DEBUG_INSN, move any notes in between last real insn and the last DEBUG_INSN after the last DEBUG_INSN. * gcc.dg/pr42918.c: New test. From-SVN: r156823 --- gcc/ChangeLog | 7 +++++++ gcc/caller-save.c | 35 ++++++++++++++++++++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr42918.c | 21 ++++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr42918.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index efb042d37fa..31f251d2c75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-02-17 Jakub Jelinek + + PR debug/42918 + * caller-save.c (save_call_clobbered_regs): If BB ends with + a DEBUG_INSN, move any notes in between last real insn and the last + DEBUG_INSN after the last DEBUG_INSN. + 2010-02-16 Joern Rennecke * tm.texi (TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC): diff --git a/gcc/caller-save.c b/gcc/caller-save.c index a6faeea1969..dbfd42aa793 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -1,6 +1,6 @@ /* Save and restore call-clobbered registers which are live across a call. Copyright (C) 1989, 1992, 1994, 1995, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -754,7 +754,7 @@ setup_save_areas (void) void save_call_clobbered_regs (void) { - struct insn_chain *chain, *next; + struct insn_chain *chain, *next, *last = NULL; enum machine_mode save_mode [FIRST_PSEUDO_REGISTER]; /* Computed in mark_set_regs, holds all registers set by the current @@ -861,6 +861,7 @@ save_call_clobbered_regs (void) if (TEST_HARD_REG_BIT (hard_regs_saved, regno)) n_regs_saved++; } + last = chain; } else if (DEBUG_INSN_P (insn) && n_regs_saved) mark_referenced_regs (&PATTERN (insn), @@ -874,6 +875,36 @@ save_call_clobbered_regs (void) remain saved. If the last insn in the block is a JUMP_INSN, put the restore before the insn, otherwise, put it after the insn. */ + if (DEBUG_INSN_P (insn) && last && last->block == chain->block) + { + rtx ins, prev; + basic_block bb = BLOCK_FOR_INSN (insn); + + /* When adding hard reg restores after a DEBUG_INSN, move + all notes between last real insn and this DEBUG_INSN after + the DEBUG_INSN, otherwise we could get code + -g/-g0 differences. */ + for (ins = PREV_INSN (insn); ins != last->insn; ins = prev) + { + prev = PREV_INSN (ins); + if (NOTE_P (ins)) + { + NEXT_INSN (prev) = NEXT_INSN (ins); + PREV_INSN (NEXT_INSN (ins)) = prev; + PREV_INSN (ins) = insn; + NEXT_INSN (ins) = NEXT_INSN (insn); + NEXT_INSN (insn) = ins; + if (NEXT_INSN (ins)) + PREV_INSN (NEXT_INSN (ins)) = ins; + if (BB_END (bb) == insn) + BB_END (bb) = ins; + } + else + gcc_assert (DEBUG_INSN_P (ins)); + } + } + last = NULL; + if (n_regs_saved) for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) if (TEST_HARD_REG_BIT (hard_regs_saved, regno)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1af8f3fc2f..7d3f9bdfb47 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-17 Jakub Jelinek + + PR debug/42918 + * gcc.dg/pr42918.c: New test. + 2010-02-16 H.J. Lu * g++.dg/ext/attrib36.C: Require ILP32. diff --git a/gcc/testsuite/gcc.dg/pr42918.c b/gcc/testsuite/gcc.dg/pr42918.c new file mode 100644 index 00000000000..8a3eef5eeec --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42918.c @@ -0,0 +1,21 @@ +/* PR debug/42918 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug -ftracer" } */ + +extern int fi (void); +extern void fv (void); + +int +f (int i, int j) +{ + if (!j) + { + fv (); + goto lab; + } + i = fi (); + if (i == j) + fv (); +lab: + return i; +}