diff options
author | Jakub Jelinek <jakub@redhat.com> | 2001-11-15 11:41:48 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2001-11-15 11:41:48 +0100 |
commit | feb265abdb7bce4cb67733dc1c1c96644e6f790f (patch) | |
tree | 361d0de7f868ea7e399a885307f7d6c9618fee0f | |
parent | 8f5a5db8187f51e0cbbf8bbb1b13be97fdf2fe4b (diff) | |
download | gcc-feb265abdb7bce4cb67733dc1c1c96644e6f790f.zip gcc-feb265abdb7bce4cb67733dc1c1c96644e6f790f.tar.gz gcc-feb265abdb7bce4cb67733dc1c1c96644e6f790f.tar.bz2 |
cfgcleanup.c (try_optimize_cfg): If try_simplify_condjump optimized conditional jump...
* cfgcleanup.c (try_optimize_cfg): If try_simplify_condjump optimized
conditional jump, request updating life into for the block
containing it. Fix a typo which prevented life info update.
Clear blocks bitmap before using it.
* gcc.c-torture/compile/20011114-3.c: New test.
From-SVN: r47050
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20011114-3.c | 42 |
4 files changed, 54 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 010e93e..167bd63 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -12,6 +12,11 @@ * config/ia64/ia64.c (ia64_adjust_cost): Handle SUBREGs. + * cfgcleanup.c (try_optimize_cfg): If try_simplify_condjump optimized + conditional jump, request updating life into for the block + containing it. Fix a typo which prevented life info update. + Clear blocks bitmap before using it. + 2001-11-15 Neil Booth <neil@daikokuya.demon.co.uk> * c-common.c: Include c-lex.h. diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 03f767a..28f3a1f 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1211,7 +1211,10 @@ try_optimize_cfg (mode) /* Simplify branch over branch. */ if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b)) - changed_here = true; + { + BB_SET_FLAG (b, BB_UPDATE_LIFE); + changed_here = true; + } /* If B has a single outgoing edge, but uses a non-trivial jump instruction without side-effects, we can either delete the @@ -1261,10 +1264,11 @@ try_optimize_cfg (mode) if (mode & CLEANUP_CROSSJUMP) remove_fake_edges (); - if ((mode & CLEANUP_UPDATE_LIFE) & changed_overall) + if ((mode & CLEANUP_UPDATE_LIFE) && changed_overall) { bool found = 0; blocks = sbitmap_alloc (n_basic_blocks); + sbitmap_zero (blocks); for (i = 0; i < n_basic_blocks; i++) if (BB_FLAGS (BASIC_BLOCK (i)) & BB_UPDATE_LIFE) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 38adc49..1981a9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,7 @@ 2001-11-15 Jakub Jelinek <jakub@redhat.com> * gcc.c-torture/compile/20011114-2.c: New test. + * gcc.c-torture/compile/20011114-3.c: New test. * gcc.c-torture/compile/20011114-4.c: New test. 2001-11-15 Nathan Sidwell <nathan@codesourcery.com> diff --git a/gcc/testsuite/gcc.c-torture/compile/20011114-3.c b/gcc/testsuite/gcc.c-torture/compile/20011114-3.c new file mode 100644 index 0000000..8827925 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20011114-3.c @@ -0,0 +1,42 @@ +typedef struct { int s, t; } C; +C x; +int foo (void); +void bar (int); + +int baz (void) +{ + int a = 0, c, d = 0; + C *b = &x; + + while ((c = foo ())) + switch(c) + { + case 23: + bar (1); + break; + default: + break; + } + + if (a == 0 || (a & 1)) + { + if (b->s) + { + if (a) + bar (1); + else + a = 16; + } + else if (b->t) + { + if (a) + bar (1); + else + a = 32; + } + } + + if (d && (a & ~127)) + bar (2); + return 0; +} |