aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-11-15 11:41:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2001-11-15 11:41:48 +0100
commitfeb265abdb7bce4cb67733dc1c1c96644e6f790f (patch)
tree361d0de7f868ea7e399a885307f7d6c9618fee0f
parent8f5a5db8187f51e0cbbf8bbb1b13be97fdf2fe4b (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cfgcleanup.c8
-rw-r--r--gcc/testsuite/ChangeLog1
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20011114-3.c42
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;
+}