aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>2000-05-16 18:44:03 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-05-16 18:44:03 -0700
commitf5540cd4aacb0a614929b2afa0912d2f28ba00f1 (patch)
treed6bcb2f865cce1fba604f777cacacf150b20230e
parent23568fa021aa71b8bab49c2b9fc0ed58f30b033d (diff)
downloadgcc-f5540cd4aacb0a614929b2afa0912d2f28ba00f1.zip
gcc-f5540cd4aacb0a614929b2afa0912d2f28ba00f1.tar.gz
gcc-f5540cd4aacb0a614929b2afa0912d2f28ba00f1.tar.bz2
flow.c (commit_one_edge_insertion): Be prepared for a return insn to be inserted on the edge with a normal jump.
* flow.c (commit_one_edge_insertion): Be prepared for a return insn to be inserted on the edge with a normal jump. * jump.c (jump_optimize_1): Don't look to create return isns. * flow.c (flow_delete_insn): Don't adjust reference count of notes. * jump.c (jump_optimize_1): Likewise. (returnjump_p): Verify the argument is a JUMP_INSN. * rtl.def (NOTE): Add 5th element for NOTE_INSN_DELETED_LABEL. From-SVN: r33950
-rw-r--r--gcc/ChangeLog83
-rw-r--r--gcc/flow.c60
-rw-r--r--gcc/jump.c18
-rw-r--r--gcc/rtl.def8
4 files changed, 91 insertions, 78 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5efee53..30504a9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2000-05-16 Richard Henderson <rth@cygnus.com>
+
+ * flow.c (commit_one_edge_insertion): Be prepared for a return
+ insn to be inserted on the edge with a normal jump.
+ * jump.c (jump_optimize_1): Don't look to create return isns.
+
+ * flow.c (flow_delete_insn): Don't adjust reference count of notes.
+ * jump.c (jump_optimize_1): Likewise.
+ (returnjump_p): Verify the argument is a JUMP_INSN.
+ * rtl.def (NOTE): Add 5th element for NOTE_INSN_DELETED_LABEL.
+
2000-05-16 Nick Clifton <nickc@cygnus.com>
* config/m32r/m32r.c (small_insn_p): Use INSN_P() to replace
@@ -307,23 +318,23 @@ Fri May 12 19:03:58 2000 Philippe De Muyter <phdm@macqel.be>
2000-05-12 Zack Weinberg <zack@wolery.cumb.org>
- * fixinc/fixfixes.c (IO_use_fix, IO_defn_fix, CTRL_use_fix,
- CTRL_defn_fix): Delete.
- (fix_char_macro_defines, fix_char_macro_uses): Rename to
- char_macro_def_fix and char_macro_use_fix, respectively. Put
- them into the FIXUP_TABLE. Get the string to search for from
- a c_fix_arg.
+ * fixinc/fixfixes.c (IO_use_fix, IO_defn_fix, CTRL_use_fix,
+ CTRL_defn_fix): Delete.
+ (fix_char_macro_defines, fix_char_macro_uses): Rename to
+ char_macro_def_fix and char_macro_use_fix, respectively. Put
+ them into the FIXUP_TABLE. Get the string to search for from
+ a c_fix_arg.
- (format_write): New function.
- (format_fix): Use it.
+ (format_write): New function.
+ (format_fix): Use it.
- (FIX_PROC_HEAD): Constify text parameter.
- (machine_name_fix): Constify all char *s.
- * fixtests.c (skip_quote): Remove double static.
+ (FIX_PROC_HEAD): Constify text parameter.
+ (machine_name_fix): Constify all char *s.
+ * fixtests.c (skip_quote): Remove double static.
- * inclhack.def (io_def_quotes, io_use_quotes, ctrl_def_quotes,
- ctrl_use_quotes): Update for new scheme.
- * fixincl.x: Regenerate.
+ * inclhack.def (io_def_quotes, io_use_quotes, ctrl_def_quotes,
+ ctrl_use_quotes): Update for new scheme.
+ * fixincl.x: Regenerate.
2000-05-12 Alexandre Oliva <aoliva@cygnus.com>
@@ -492,9 +503,9 @@ Wed 10 May 09:36:47 2000 Neil Booth <NeilB@earthling.net>
Wed 10 May 09:08:30 2000 Neil Booth <NeilB@earthling.net>
- * cpplex.c (_cpp_lex_line): Maintain PREV_WHITESPACE flag
- when removing escaped newlines. Reverse sense of test for
- escaped newline.
+ * cpplex.c (_cpp_lex_line): Maintain PREV_WHITESPACE flag
+ when removing escaped newlines. Reverse sense of test for
+ escaped newline.
2000-05-09 Richard Henderson <rth@cygnus.com>
@@ -1206,17 +1217,17 @@ Thu May 4 09:45:12 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
MEM_COPY_ATTRIBUTES.
2000-05-03 Robert Lipe <robertlipe@usa.net>
-
- * configure.in (i[34567]86-*-isc*) [tmake_file]: Add t-i386bare
- to suppress libgcc1.
- (i[34567]86-*-sco3.2v5*) Likewise.
- (i[34567]86-*-sco3.2v4*) Likewise.
- (i[34567]86-*-sco) Likewise.
- (i[34567]86-*-solaris2) Likewise.
- (i[34567]86-*-sysv5*) Likewise.
- (i[34567]86-*-sysv4*) Likewise.
- (i[34567]86-*-udk*) Likewise.
- (i[34567]86-*-sysv*) Likewise.
+
+ * configure.in (i[34567]86-*-isc*) [tmake_file]: Add t-i386bare
+ to suppress libgcc1.
+ (i[34567]86-*-sco3.2v5*) Likewise.
+ (i[34567]86-*-sco3.2v4*) Likewise.
+ (i[34567]86-*-sco) Likewise.
+ (i[34567]86-*-solaris2) Likewise.
+ (i[34567]86-*-sysv5*) Likewise.
+ (i[34567]86-*-sysv4*) Likewise.
+ (i[34567]86-*-udk*) Likewise.
+ (i[34567]86-*-sysv*) Likewise.
2000-05-03 Zack Weinberg <zack@wolery.cumb.org>
@@ -1242,14 +1253,14 @@ Thu May 4 09:45:12 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
Wed May 3 21:01:46 2000 Jason Eckhardt <jle@cygnus.com>
- * bb-reorder.c (struct reorder_block_def): Member succ removed.
- (REORDER_BLOCK_SUCC): Removed.
- (enum reorder_skip_type): Removed.
- (skip_insns_between_block): Renamed to skip_insns_after_block.
- Removed second argument. Removed dead code and cleaned up.
- (make_reorder_chain): Removed use of REORDER_BLOCK_SUCC.
- (reorder_basic_blocks): Remove use of REORDER_SKIP_AFTER. Removed
- second parameter to skip_insns_after_block.
+ * bb-reorder.c (struct reorder_block_def): Member succ removed.
+ (REORDER_BLOCK_SUCC): Removed.
+ (enum reorder_skip_type): Removed.
+ (skip_insns_between_block): Renamed to skip_insns_after_block.
+ Removed second argument. Removed dead code and cleaned up.
+ (make_reorder_chain): Removed use of REORDER_BLOCK_SUCC.
+ (reorder_basic_blocks): Remove use of REORDER_SKIP_AFTER. Removed
+ second parameter to skip_insns_after_block.
Wed May 3 13:29:54 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
diff --git a/gcc/flow.c b/gcc/flow.c
index a8573e1..e24822e 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -1598,7 +1598,7 @@ static void
commit_one_edge_insertion (e)
edge e;
{
- rtx before = NULL_RTX, after = NULL_RTX, insns, tmp;
+ rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
basic_block bb;
/* Pull the insns off the edge now since the edge might go away. */
@@ -1675,37 +1675,38 @@ commit_one_edge_insertion (e)
emit_insns_before (insns, before);
if (before == bb->head)
bb->head = insns;
+
+ last = prev_nonnote_insn (before);
}
else
{
- rtx last = emit_insns_after (insns, after);
+ last = emit_insns_after (insns, after);
if (after == bb->end)
- {
- bb->end = last;
+ bb->end = last;
+ }
- if (GET_CODE (last) == JUMP_INSN)
- {
- if (returnjump_p (last))
- {
- /* ??? Remove all outgoing edges from BB and add one
- for EXIT. This is not currently a problem because
- this only happens for the (single) epilogue, which
- already has a fallthru edge to EXIT. */
-
- e = bb->succ;
- if (e->dest != EXIT_BLOCK_PTR
- || e->succ_next != NULL
- || (e->flags & EDGE_FALLTHRU) == 0)
- abort ();
- e->flags &= ~EDGE_FALLTHRU;
-
- emit_barrier_after (last);
- }
- else
- abort ();
- }
- }
+ if (returnjump_p (last))
+ {
+ /* ??? Remove all outgoing edges from BB and add one for EXIT.
+ This is not currently a problem because this only happens
+ for the (single) epilogue, which already has a fallthru edge
+ to EXIT. */
+
+ e = bb->succ;
+ if (e->dest != EXIT_BLOCK_PTR
+ || e->succ_next != NULL
+ || (e->flags & EDGE_FALLTHRU) == 0)
+ abort ();
+ e->flags &= ~EDGE_FALLTHRU;
+
+ emit_barrier_after (last);
+ bb->end = last;
+
+ if (before)
+ flow_delete_insn (before);
}
+ else if (GET_CODE (last) == JUMP_INSN)
+ abort ();
}
/* Update the CFG for all queued instructions. */
@@ -2027,11 +2028,14 @@ flow_delete_insn (insn)
/* If deleting a jump, decrement the use count of the label. Deleting
the label itself should happen in the normal course of block merging. */
- if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn))
+ if (GET_CODE (insn) == JUMP_INSN
+ && JUMP_LABEL (insn)
+ && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
LABEL_NUSES (JUMP_LABEL (insn))--;
/* Also if deleting an insn that references a label. */
- else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX)
+ else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
+ && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
LABEL_NUSES (XEXP (note, 0))--;
return next;
diff --git a/gcc/jump.c b/gcc/jump.c
index dad373f..7f42235 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -231,11 +231,13 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
mark_all_labels (f, cross_jump);
- /* Keep track of labels used from static data;
- they cannot ever be deleted. */
+ /* Keep track of labels used from static data; we don't track them
+ closely enough to delete them here, so make sure their reference
+ count doesn't drop to zero. */
for (insn = forced_labels; insn; insn = XEXP (insn, 1))
- LABEL_NUSES (XEXP (insn, 0))++;
+ if (GET_CODE (XEXP (insn, 0)) == CODE_LABEL)
+ LABEL_NUSES (XEXP (insn, 0))++;
check_exception_handler_labels ();
@@ -381,14 +383,6 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
}
}
- /* If a jump references the end of the function, try to turn
- it into a RETURN insn, possibly a conditional one. */
- if (JUMP_LABEL (insn) != 0
- && (next_active_insn (JUMP_LABEL (insn)) == 0
- || GET_CODE (PATTERN (next_active_insn (JUMP_LABEL (insn))))
- == RETURN))
- changed |= redirect_jump (insn, NULL_RTX);
-
reallabelprev = prev_active_insn (JUMP_LABEL (insn));
/* Detect jump to following insn. */
@@ -2261,6 +2255,8 @@ int
returnjump_p (insn)
rtx insn;
{
+ if (GET_CODE (insn) != JUMP_INSN)
+ return 0;
return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
}
diff --git a/gcc/rtl.def b/gcc/rtl.def
index 97df537..1f628aa 100644
--- a/gcc/rtl.def
+++ b/gcc/rtl.def
@@ -421,9 +421,11 @@ DEF_RTL_EXPR(BARRIER, "barrier", "iuu", 'x')
DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuu00iss", 'x')
/* Say where in the code a source line starts, for symbol table's sake.
- Contains a filename and a line number. Line numbers <= 0 are special;
- See enum note_insn in rtl.h. */
-DEF_RTL_EXPR(NOTE, "note", "iuu0n", 'x')
+ Operand:
+ 3: filename, if line number > 0, note-specific data otherwise.
+ 4: line number if > 0, enum note_insn otherwise.
+ 5: unique number if line number == note_insn_deleted_label. */
+DEF_RTL_EXPR(NOTE, "note", "iuu0ni", 'x')
/* ----------------------------------------------------------------------
Top level constituents of INSN, JUMP_INSN and CALL_INSN.