diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 93a10d71d78c4f4a5c922422121e20a3f45725f4..ece6e7eb5113f9f6120d4e9a1c5370f241b00d04 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a654677d188a8a72e867aa5d6da718350ad36821..d21d5a778b70a0d862586072a07fc9b43be6ee5e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000000000000000000000000000000000000..cb6b8258ba7dfed28aa8fa690358f584a19351ef
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assign_7.f
@@ -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
+
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 9ba761dcf4a91259a01812fca72ef8f5e44a577b..85d588a131c8ba383bc67503dcc1a5a84c50ac62 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -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);