From: Hariharan Sandanagobalane Date: Sat, 28 Aug 2010 16:40:27 +0000 (+0000) Subject: re PR target/45299 (Dwarf information is wrong with optimised code.) X-Git-Tag: releases/gcc-4.6.0~4798 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=179ba6b8829d24d987f5e49dfcf218e7cb667784;p=thirdparty%2Fgcc.git re PR target/45299 (Dwarf information is wrong with optimised code.) * config/picochip/picochip.c (reorder_var_tracking_notes): This function was dropping debug insns which caused PR45299. From-SVN: r163617 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 196b4269534c..a7620cab641d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ -2010-08-28 Uros Bizjak +2010-08-28 Hariharan Sandanagobalane + + * config/picochip/picochip.c (reorder_var_tracking_notes): This + function was dropping debug insns which caused PR45299. +2010-08-28 Uros Bizjak * config/i386/sse.md (extsuffix): New code attribute. (sse4_1_v8qiv8hi2): Macroize insn from sse4_1_extendv8qiv8hi2 and sse4_1_zero_extendv8qiv8hi2 using any_extend code iterator. diff --git a/gcc/config/picochip/picochip.c b/gcc/config/picochip/picochip.c index 30c49224a675..ded84e32c6b4 100644 --- a/gcc/config/picochip/picochip.c +++ b/gcc/config/picochip/picochip.c @@ -3138,40 +3138,68 @@ static void reorder_var_tracking_notes (void) { basic_block bb; + FOR_EACH_BB (bb) { - rtx insn, next; + rtx insn, next, last_insn = NULL_RTX; + rtx vliw_start = NULL_RTX; rtx queue = NULL_RTX; - for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = next) - { - next = NEXT_INSN (insn); + /* Iterate through the bb and find the last non-debug insn */ + for (insn = BB_HEAD (bb); insn != NEXT_INSN(BB_END (bb)); insn = NEXT_INSN(insn)) + { + if (NONDEBUG_INSN_P(insn)) + last_insn = insn; + } - if (NONDEBUG_INSN_P (insn)) - { - /* Emit queued up notes before the first instruction of a bundle. */ - if (GET_MODE (insn) == TImode) - { - while (queue) - { - rtx next_queue = PREV_INSN (queue); - NEXT_INSN (PREV_INSN(insn)) = queue; - PREV_INSN (queue) = PREV_INSN(insn); - PREV_INSN (insn) = queue; - NEXT_INSN (queue) = insn; - queue = next_queue; - } - } - } - else if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION) - { - rtx prev = PREV_INSN (insn); - PREV_INSN (next) = prev; - NEXT_INSN (prev) = next; + /* In all normal cases, queue up notes and emit them just before a TImode + instruction. For the last instruction, emit the queued notes just after + the last instruction. */ + for (insn = BB_HEAD (bb); insn != NEXT_INSN(BB_END (bb)); insn = next) + { + next = NEXT_INSN (insn); + + if (insn == last_insn) + { + while (queue) + { + rtx next_queue = PREV_INSN (queue); + PREV_INSN (NEXT_INSN(insn)) = queue; + NEXT_INSN(queue) = NEXT_INSN(insn); + PREV_INSN(queue) = insn; + NEXT_INSN(insn) = queue; + queue = next_queue; + } + /* There is no more to do for this bb. break*/ + break; + } + else if (NONDEBUG_INSN_P (insn)) + { + /* Emit queued up notes before the first instruction of a bundle. */ + if (GET_MODE (insn) == TImode) + { + while (queue) + { + rtx next_queue = PREV_INSN (queue); + NEXT_INSN (PREV_INSN(insn)) = queue; + PREV_INSN (queue) = PREV_INSN(insn); + PREV_INSN (insn) = queue; + NEXT_INSN (queue) = insn; + queue = next_queue; + } + } + } + else if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION) + { + rtx prev = PREV_INSN (insn); + PREV_INSN (next) = prev; + NEXT_INSN (prev) = next; PREV_INSN (insn) = queue; - queue = insn; - } - } + queue = insn; + } + } + /* Make sure we are not dropping debug instructions.*/ + gcc_assert (queue == NULL_RTX); } }