jump.c (mark_jump_label): Record REG_LABEL notes for insns which refer to the CODE_LA...
authorJeffrey A Law <law@cygnus.com>
Wed, 8 Apr 1998 22:47:50 +0000 (22:47 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 8 Apr 1998 22:47:50 +0000 (16:47 -0600)
        * jump.c (mark_jump_label): Record REG_LABEL notes for insns which
        refer to the CODE_LABEL before a dispatch table.

From-SVN: r19060

gcc/ChangeLog
gcc/jump.c

index 2207362539fc3ea3b239523bcbb7470db1c278bc..6462e6e5477fad9a484a6c2771cea8b4a07aab02 100644 (file)
@@ -23,6 +23,9 @@ Fri Apr  3 17:02:13 1998  Alexandre Petit-Bianco  <apbianco@cygnus.com>
 
 Wed Apr  8 12:51:19 1998  Jeffrey A Law  (law@cygnus.com)
 
+       * jump.c (mark_jump_label): Record REG_LABEL notes for insns which
+       refer to the CODE_LABEL before a dispatch table.
+
        * invoke.texi: Add ARC options.
 
        * gcc.c (proces_command): Improve error message for -o with
index e0d20a60caf21d148777b9039abf33dd178f244a..ef80eb61556cd01cc31f7e40a020ebfe17560a9f 100644 (file)
@@ -3397,17 +3397,21 @@ mark_jump_label (x, insn, cross_jump)
               is one.  */
            else if (! find_reg_note (insn, REG_LABEL, label))
              {
-               rtx next = next_real_insn (label);
-               /* Don't record labels that refer to dispatch tables.
-                  This is not necessary, since the tablejump
-                  references the same label.
-                  And if we did record them, flow.c would make worse code.  */
-               if (next == 0
-                   || ! (GET_CODE (next) == JUMP_INSN
-                         && (GET_CODE (PATTERN (next)) == ADDR_VEC
-                             || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC)))
-                 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL, label,
-                                                       REG_NOTES (insn));
+               /* This code used to ignore labels which refered to dispatch
+                  tables to avoid flow.c generating worse code.
+
+                  However, in the presense of global optimizations like
+                  gcse which call find_basic_blocks without calling
+                  life_analysis, not recording such labels will lead
+                  to compiler aborts because of inconsistencies in the
+                  flow graph.  So we go ahead and record the label.
+
+                  It may also be the case that the optimization argument
+                  is no longer valid because of the more accurate cfg
+                  we build in find_basic_blocks -- it no longer pessimizes
+                  code when it finds a REG_LABEL note.  */
+               REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL, label,
+                                                     REG_NOTES (insn));
              }
          }
        return;