From feb265abdb7bce4cb67733dc1c1c96644e6f790f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 15 Nov 2001 11:41:48 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++ gcc/cfgcleanup.c | 8 +++- gcc/testsuite/ChangeLog | 1 + .../gcc.c-torture/compile/20011114-3.c | 42 +++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20011114-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 010e93eb01b..167bd63590e 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 * c-common.c: Include c-lex.h. diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 03f767a4df3..28f3a1fb0c8 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 38adc49465f..1981a9ef20f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,7 @@ 2001-11-15 Jakub Jelinek * 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 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 00000000000..882792525c9 --- /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; +} -- 2.30.2