diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/jump.c | 26 |
2 files changed, 18 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2207362..6462e6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 @@ -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; |