2006-02-05 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Feb 2006 20:29:10 +0000 (20:29 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Feb 2006 20:29:10 +0000 (20:29 +0000)
        PR tree-opt/25251
        * tree-cfg.c (cleanup_dead_labels): Also don't remove
        forced labels.

2006-02-05  Andrew Pinski  <pinskia@physics.uc.edu>

        PR tree-opt/25251
        * gfortran.dg/assign_7.f: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/assign_7.f [new file with mode: 0644]
gcc/tree-cfg.c

index 93a10d7..ece6e7e 100644 (file)
@@ -1,3 +1,9 @@
+2006-02-05  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR tree-opt/25251
+       * tree-cfg.c (cleanup_dead_labels): Also don't remove
+       forced labels.
+
 2006-02-04  Zdenek Dvorak <dvorakz@suse.cz>
 
        * tree-vrp.c (cfg_loops): Removed.
index a654677..d21d5a7 100644 (file)
@@ -1,3 +1,8 @@
+2006-02-05  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR tree-opt/25251
+       * gfortran.dg/assign_7.f: New test.
+
 2006-02-05  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR fortran/26041
diff --git a/gcc/testsuite/gfortran.dg/assign_7.f b/gcc/testsuite/gfortran.dg/assign_7.f
new file mode 100644 (file)
index 0000000..cb6b825
--- /dev/null
@@ -0,0 +1,16 @@
+C { dg-do compile }
+C Option passed to avoid excess errors from obsolete warning
+C { dg-options "-w" }
+
+      PROGRAM FM013
+      IF (ICZERO) 31270, 1270, 31270
+ 1270 CONTINUE
+ 1272 ASSIGN 1273 TO J
+ 1273 ASSIGN 1274 TO J
+ 1274 ASSIGN 1275 TO J
+      GOTO 1276
+ 1275 continue
+ 1276 GOTO J, ( 1272, 1273, 1274, 1275 )
+31270 IVDELE = IVDELE + 1
+      END
+
index 9ba761d..85d588a 100644 (file)
@@ -1108,7 +1108,8 @@ cleanup_dead_labels (void)
   for_each_eh_region (update_eh_label);
 
   /* Finally, purge dead labels.  All user-defined labels and labels that
-     can be the target of non-local gotos are preserved.  */
+     can be the target of non-local gotos and labels which have their
+     address taken are preserved.  */
   FOR_EACH_BB (bb)
     {
       block_stmt_iterator i;
@@ -1128,7 +1129,8 @@ cleanup_dead_labels (void)
 
          if (label == label_for_this_bb
              || ! DECL_ARTIFICIAL (label)
-             || DECL_NONLOCAL (label))
+             || DECL_NONLOCAL (label)
+             || FORCED_LABEL (label))
            bsi_next (&i);
          else
            bsi_remove (&i, true);