summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-23 15:22:05 +0000
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-23 15:22:05 +0000
commit43a852ea4edb3bace60c8f0880cdc1768ace6151 (patch)
tree40fccab8e687849f2b4ac8156c613c1dd0531a4a /gcc
parent2c64e1a1654e517d649af553c5d100983f76e85a (diff)
downloadgcc-43a852ea4edb3bace60c8f0880cdc1768ace6151.tar.gz
2002-05-23 David S. Miller <davem@redhat.com>
* basic-block.h (CLEANUP_NO_INSN_DEL): Define it. * cfgcleanup.c (cleanup_cfg): If it is set do not attempt to delete trivially dead insns. * except.c (finish_eh_generation): Pass it to cleanup_cfg. * toplev.c (rest_of_compilation): Document non-trivial aspect the RTL before optimize_save_area_alloca is run. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53789 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/basic-block.h2
-rw-r--r--gcc/cfgcleanup.c6
-rw-r--r--gcc/except.c4
-rw-r--r--gcc/toplev.c5
5 files changed, 21 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9da36a96634..d7334a9cb7a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2002-05-23 David S. Miller <davem@redhat.com>
+
+ * basic-block.h (CLEANUP_NO_INSN_DEL): Define it.
+ * cfgcleanup.c (cleanup_cfg): If it is set do not
+ attempt to delete trivially dead insns.
+ * except.c (finish_eh_generation): Pass it to cleanup_cfg.
+ * toplev.c (rest_of_compilation): Document non-trivial aspect
+ the RTL before optimize_save_area_alloca is run.
+
2002-05-23 Neil Booth <neil@daikokuya.demon.co.uk>
* c-lex.c (indent_level): Remove.
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index cf0d13ad2d5..69ec1224b4e 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -595,6 +595,8 @@ enum update_life_extent
notes. */
#define CLEANUP_UPDATE_LIFE 32 /* Keep life information up to date. */
#define CLEANUP_THREADING 64 /* Do jump threading. */
+#define CLEANUP_NO_INSN_DEL 128 /* Do not try to delete trivially dead
+ insns. */
/* Flags for loop discovery. */
#define LOOP_TREE 1 /* Build loop hierarchy tree. */
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index d5f6de18555..1e4056a60f4 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -1800,7 +1800,8 @@ cleanup_cfg (mode)
changed = true;
/* We've possibly created trivially dead code. Cleanup it right
now to introduce more oppurtunities for try_optimize_cfg. */
- if (!(mode & (CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL))
+ if (!(mode & (CLEANUP_NO_INSN_DEL
+ | CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL))
&& !reload_completed)
delete_trivially_dead_insns (get_insns(), max_reg_num ());
}
@@ -1819,7 +1820,8 @@ cleanup_cfg (mode)
| PROP_LOG_LINKS))
break;
}
- else if (!(mode & CLEANUP_PRE_SIBCALL) && !reload_completed)
+ else if (!(mode & (CLEANUP_NO_INSN_DEL | CLEANUP_PRE_SIBCALL))
+ && !reload_completed)
{
if (!delete_trivially_dead_insns (get_insns(), max_reg_num ()))
break;
diff --git a/gcc/except.c b/gcc/except.c
index e1f32a56718..ee6ee9f023d 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -2501,7 +2501,7 @@ finish_eh_generation ()
rebuild_jump_labels (get_insns ());
find_basic_blocks (get_insns (), max_reg_num (), 0);
- cleanup_cfg (CLEANUP_PRE_LOOP);
+ cleanup_cfg (CLEANUP_PRE_LOOP | CLEANUP_NO_INSN_DEL);
/* These registers are used by the landing pads. Make sure they
have been generated. */
@@ -2524,7 +2524,7 @@ finish_eh_generation ()
find_exception_handler_labels ();
rebuild_jump_labels (get_insns ());
find_basic_blocks (get_insns (), max_reg_num (), 0);
- cleanup_cfg (CLEANUP_PRE_LOOP);
+ cleanup_cfg (CLEANUP_PRE_LOOP | CLEANUP_NO_INSN_DEL);
}
static hashval_t
diff --git a/gcc/toplev.c b/gcc/toplev.c
index fc4f658c62b..bb6a4486d83 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -2573,7 +2573,10 @@ rest_of_compilation (decl)
unshare_all_rtl (current_function_decl, insns);
#ifdef SETJMP_VIA_SAVE_AREA
- /* This must be performed before virtual register instantiation. */
+ /* This must be performed before virtual register instantiation.
+ Please be aware the everything in the compiler that can look
+ at the RTL up to this point must understand that REG_SAVE_AREA
+ is just like a use of the REG contained inside. */
if (current_function_calls_alloca)
optimize_save_area_alloca (insns);
#endif