]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/45299 (Dwarf information is wrong with optimised code.)
authorHariharan Sandanagobalane <hariharan@picochip.com>
Sat, 28 Aug 2010 16:40:27 +0000 (16:40 +0000)
committerHariharan Sandanagobalane <hariharans@gcc.gnu.org>
Sat, 28 Aug 2010 16:40:27 +0000 (16:40 +0000)
        * config/picochip/picochip.c (reorder_var_tracking_notes): This
          function was dropping debug insns which caused PR45299.

From-SVN: r163617

gcc/ChangeLog
gcc/config/picochip/picochip.c

index 196b4269534c108aa16351ab7b05e2900b8c9589..a7620cab641d586a4b81f693781638df4a6fd2bb 100644 (file)
@@ -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.
index 30c49224a67530d80477aaefb24b3f06ffbec3b7..ded84e32c6b4535e46acac99fe84a3e42029ff5f 100644 (file)
@@ -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);
     }
 }