OSDN Git Service

2005-03-18 Andrew Haley <aph@redhat.com>
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Mar 2005 13:59:06 +0000 (13:59 +0000)
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Mar 2005 13:59:06 +0000 (13:59 +0000)
        PR java/20522
        * decl.c (update_aliases): Don't update variables that are about
        to die.
        (maybe_poplevels): Add comment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96683 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/decl.c

index cd374a2..bcf9156 100644 (file)
@@ -1,3 +1,10 @@
+2005-03-18  Andrew Haley  <aph@redhat.com>
+
+       PR java/20522
+       * decl.c (update_aliases): Don't update variables that are about
+       to die.
+       (maybe_poplevels): Add comment.
+
 2005-03-17  Bryce McKinlay  <mckinlay@redhat.com>
 
        PR java/20502
 2005-03-17  Bryce McKinlay  <mckinlay@redhat.com>
 
        PR java/20502
index 720b632..2f9da97 100644 (file)
@@ -149,7 +149,10 @@ update_aliases (tree decl, int index, int pc)
          && LOCAL_SLOT_P (tmp) == 0
          && (pc == -1
              || (pc >= DECL_LOCAL_START_PC (tmp)
          && LOCAL_SLOT_P (tmp) == 0
          && (pc == -1
              || (pc >= DECL_LOCAL_START_PC (tmp)
-                 && pc <= DECL_LOCAL_END_PC (tmp)))
+                 && pc < DECL_LOCAL_END_PC (tmp)))
+         /* This test is < (rather than <=) because there's no point
+            updating an alias that's about to die at the end of this
+            instruction.  */
          && (tmp_type == decl_type
              || (INTEGRAL_TYPE_P (tmp_type)
                  && INTEGRAL_TYPE_P (decl_type)
          && (tmp_type == decl_type
              || (INTEGRAL_TYPE_P (tmp_type)
                  && INTEGRAL_TYPE_P (decl_type)
@@ -1741,6 +1744,12 @@ maybe_poplevels (int pc)
   current_pc = pc;
 #endif
 
   current_pc = pc;
 #endif
 
+  /* FIXME: I'm pretty sure that this is wrong.  Variable scopes are
+     inclusive, so a variable is live if pc == end_pc.  Here, we
+     terminate a range if the current pc is equal to the end of the
+     range, and this is *before* we have generated code for the
+     instruction at end_pc.  We're closing a binding level one
+     instruction too early.*/
   while (current_binding_level->end_pc <= pc)
     poplevel (1, 0, 0);
 }
   while (current_binding_level->end_pc <= pc)
     poplevel (1, 0, 0);
 }