loop.c (mark_loop_jump): Handle LO_SUM.
authorJeff Law <law@gcc.gnu.org>
Mon, 15 Feb 1999 10:37:22 +0000 (03:37 -0700)
committerJeff Law <law@gcc.gnu.org>
Mon, 15 Feb 1999 10:37:22 +0000 (03:37 -0700)

        * loop.c (mark_loop_jump): Handle LO_SUM.  If we encounter something
        we do not understand, mark the loop and containing loops as invalid.

From-SVN: r25215

gcc/loop.c

index 3c8e890e5c20def95770b26fe03a6fa6dd75446d..3ea975164f0e685ed646e1e969d9d45b60cfd39a 100644 (file)
@@ -2981,6 +2981,11 @@ mark_loop_jump (x, loop_num)
       mark_loop_jump (XEXP (x, 1), loop_num);
       return;
 
+    case LO_SUM:
+      /* This may refer to a LABEL_REF or SYMBOL_REF.  */
+      mark_loop_jump (XEXP (x, 1), loop_num);
+      return;
+
     case SIGN_EXTEND:
     case ZERO_EXTEND:
       mark_loop_jump (XEXP (x, 0), loop_num);
@@ -3068,21 +3073,21 @@ mark_loop_jump (x, loop_num)
       return;
 
     default:
-      /* Treat anything else (such as a symbol_ref)
-        as a branch out of this loop, but not into any loop.  */
-
+      /* Strictly speaking this is not a jump into the loop, only a possible
+        jump out of the loop.  However, we have no way to link the destination
+        of this jump onto the list of exit labels.  To be safe we mark this
+        loop and any containing loops as invalid.  */
       if (loop_num != -1)
        {
-#ifdef HAVE_decrement_and_branch_on_count
-         LABEL_OUTSIDE_LOOP_P (x) = 1;
-         LABEL_NEXTREF (x) = loop_number_exit_labels[loop_num];
-#endif  /* HAVE_decrement_and_branch_on_count */
-
-         loop_number_exit_labels[loop_num] = x;
-
          for (outer_loop = loop_num; outer_loop != -1;
               outer_loop = loop_outer_loop[outer_loop])
-           loop_number_exit_count[outer_loop]++;
+           {
+             if (loop_dump_stream && ! loop_invalid[outer_loop])
+               fprintf (loop_dump_stream,
+                        "\nLoop at %d ignored due to unknown exit jump.\n",
+                        INSN_UID (loop_number_loop_starts[outer_loop]));
+             loop_invalid[outer_loop] = 1;
+           }
        }
       return;
     }