diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/loop-3.c | 45 |
4 files changed, 68 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 720bb0ad1f2..9c99787c34c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-04-23 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR optimization/13985 + * cfgloopmanip.c (fix_loop_placements): New prototype. + Call fix_bb_placements on the preheader of loops that have + been reparented. + (remove_path): Adjust call to fix_loop_placements. + 2004-04-23 Andrew Pinski <pinskia@physics.uc.edu> * config/darwin7.h: New file. @@ -241,7 +249,7 @@ to "Not triggered by any -O level" section. Adjust commentary accordingly. -2004-04-20 Anil Paranjpe <anilp1@kpitcummins.com> +2004-04-20 Anil Paranjpe <anilp1@kpitcummins.com> * toplev.c (compile_file): Move targetm.asm_out.file_end call to end. diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 59ae4a1ed7a..e3807801d23 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -41,7 +41,7 @@ static bool rpe_enum_p (basic_block, void *); static int find_path (edge, basic_block **); static bool alp_enum_p (basic_block, void *); static void add_loop (struct loops *, struct loop *); -static void fix_loop_placements (struct loop *); +static void fix_loop_placements (struct loops *, struct loop *); static bool fix_bb_placement (struct loops *, basic_block); static void fix_bb_placements (struct loops *, basic_block); static void place_new_loop (struct loops *, struct loop *); @@ -413,7 +413,7 @@ remove_path (struct loops *loops, edge e) /* Fix placements of basic blocks inside loops and the placement of loops in the loop tree. */ fix_bb_placements (loops, from); - fix_loop_placements (from->loop_father); + fix_loop_placements (loops, from->loop_father); return true; } @@ -668,7 +668,7 @@ fix_loop_placement (struct loop *loop) It is used in case when we removed some edges coming out of LOOP, which may cause the right placement of LOOP inside loop tree to change. */ static void -fix_loop_placements (struct loop *loop) +fix_loop_placements (struct loops *loops, struct loop *loop) { struct loop *outer; @@ -677,6 +677,13 @@ fix_loop_placements (struct loop *loop) outer = loop->outer; if (!fix_loop_placement (loop)) break; + + /* Changing the placement of a loop in the loop tree may alter the + validity of condition 2) of the description of fix_bb_placement + for its preheader, because the successor is the header and belongs + to the loop. So call fix_bb_placements to fix up the placement + of the preheader and (possibly) of its predecessors. */ + fix_bb_placements (loops, loop_preheader_edge (loop)->src); loop = outer; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f25bfd1b0c7..82a4936e89e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-04-23 Eric Botcazou <ebotcazou@libertysurf.fr> + + * gcc.dg/loop-3.c: New test. + 2004-04-23 Daniel Jacobowitz <drow@mvista.com> * gcc.c-torture/execute/simd-5.c: New test. diff --git a/gcc/testsuite/gcc.dg/loop-3.c b/gcc/testsuite/gcc.dg/loop-3.c new file mode 100644 index 00000000000..ba6fe556315 --- /dev/null +++ b/gcc/testsuite/gcc.dg/loop-3.c @@ -0,0 +1,45 @@ +/* PR optimization/13985 */ +/* Copied from gcc.c-torture/compile/930621-1.c */ + +/* { dg-do compile } */ +/* { dg-options "-O3" } */ +/* { dg-options "-O3 -mtune=i386" { target i?86-*-* x86_64-*-* } } */ + +#if defined(STACK_SIZE) && (STACK_SIZE < 65536) +# define BYTEMEM_SIZE 10000L +#endif + +#ifndef BYTEMEM_SIZE +# define BYTEMEM_SIZE 45000L +#endif + +int bytestart[5000 + 1]; +unsigned char modtext[400 + 1]; +unsigned char bytemem[2][BYTEMEM_SIZE + 1]; + +long +modlookup (int l) +{ + signed char c; + long j; + long k; + signed char w; + long p; + while (p != 0) + { + while ((k < bytestart[p + 2]) && (j <= l) && (modtext[j] == bytemem[w][k])) + { + k = k + 1; + j = j + 1; + } + if (k == bytestart[p + 2]) + if (j > l) + c = 1; + else c = 4; + else if (j > l) + c = 3; + else if (modtext[j] < bytemem[w][k]) + c = 0; + else c = 2; + } +} |