re PR rtl-optimization/13985 (ICE in gcc.c-torture/compile/930621-1.c)

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.

From-SVN: r81112
This commit is contained in:
Eric Botcazou 2004-04-23 22:01:35 +00:00
parent 5a944040b8
commit 1548580c20
4 changed files with 68 additions and 4 deletions

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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;
}
}