diff options
author | Hariharan Sandanagobalane <hariharan@picochip.com> | 2010-08-28 16:40:27 +0000 |
---|---|---|
committer | Hariharan Sandanagobalane <hariharans@gcc.gnu.org> | 2010-08-28 16:40:27 +0000 |
commit | 179ba6b8829d24d987f5e49dfcf218e7cb667784 (patch) | |
tree | 624fdef0291d0e2bf0c487fb0c46686e96439d11 | |
parent | ee9dd92eeaf6cc38bcf14b75c2afeb825d5aa3a4 (diff) | |
download | gcc-179ba6b8829d24d987f5e49dfcf218e7cb667784.zip gcc-179ba6b8829d24d987f5e49dfcf218e7cb667784.tar.gz gcc-179ba6b8829d24d987f5e49dfcf218e7cb667784.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/picochip/picochip.c | 84 |
2 files changed, 61 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 196b426..a7620ca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ -2010-08-28 Uros Bizjak <ubizjak@gmail.com> +2010-08-28 Hariharan Sandanagobalane <hariharan@picochip.com> + + * config/picochip/picochip.c (reorder_var_tracking_notes): This + function was dropping debug insns which caused PR45299. +2010-08-28 Uros Bizjak <ubizjak@gmail.com> * config/i386/sse.md (extsuffix): New code attribute. (sse4_1_<code>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 30c4922..ded84e3 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); } } |