re PR rtl-optimization/10087 (optimizer produces wrong code when indexing 2D array)

PR opt/10087
	* gcc.dg/20030324-1.c: New test.

	PR opt/10087
	* loop.c (loop_givs_reduce): Skip bivs with duplicate locations
	while incrementing giv.
	(record_biv): Check for duplicate biv locations and
	set (struct induction *) v->same if found.

From-SVN: r64928
This commit is contained in:
Glen Nakamura 2003-03-27 18:53:36 +00:00 committed by Mark Mitchell
parent f18ab43711
commit c7d325c803
4 changed files with 61 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2003-03-27 Glen Nakamura <glen@imodulo.com>
PR opt/10087
* loop.c (loop_givs_reduce): Skip bivs with duplicate locations
while incrementing giv.
(record_biv): Check for duplicate biv locations and
set (struct induction *) v->same if found.
2003-03-27 David Mosberger <davidm@hpl.hp.com>
* unwind-libunwind.c (uw_frame_state_for): Adjust for libunwind

View File

@ -4817,6 +4817,9 @@ loop_givs_reduce (loop, bl)
{
rtx insert_before;
/* Skip if location is the same as a previous one. */
if (tv->same)
continue;
if (! auto_inc_opt)
insert_before = NEXT_INSN (tv->insn);
else if (auto_inc_opt == 1)
@ -5724,6 +5727,7 @@ record_biv (loop, v, insn, dest_reg, inc_val, mult_val, location,
v->always_computable = ! not_every_iteration;
v->always_executed = ! not_every_iteration;
v->maybe_multiple = maybe_multiple;
v->same = 0;
/* Add this to the reg's iv_class, creating a class
if this is the first incrementation of the reg. */
@ -5761,6 +5765,17 @@ record_biv (loop, v, insn, dest_reg, inc_val, mult_val, location,
/* Put it in the array of biv register classes. */
REG_IV_CLASS (ivs, REGNO (dest_reg)) = bl;
}
else
{
/* Check if location is the same as a previous one. */
struct induction *induction;
for (induction = bl->biv; induction; induction = induction->next_iv)
if (location == induction->location)
{
v->same = induction;
break;
}
}
/* Update IV_CLASS entry for this biv. */
v->next_iv = bl->biv;

View File

@ -1,3 +1,8 @@
2003-03-27 Glen Nakamura <glen@imodulo.com>
PR opt/10087
* gcc.dg/20030324-1.c: New test.
2003-03-27 Nathan Sidwell <nathan@codesourcery.com>
PR c++/10224

View File

@ -0,0 +1,33 @@
/* { dg-do run } */
/* { dg-options "-O -fstrength-reduce -fstrict-aliasing -fforce-mem -fgcse" } */
void b(int*,int*);
typedef struct {
double T1;
char c;
} S;
int main(void)
{
int i,j;
double s;
S x1[2][2];
S *x[2] = { x1[0], x1[1] };
S **E = x;
for( i=0; i < 2; i++ )
for( j=0; j < 2; j++ )
E[j][i].T1 = 1;
for( i=0; i < 2; i++ )
for( j=0; j < 2; j++ )
s = E[j][i].T1;
b(&j,&i);
printf( "result %.6e\n", s);
return 0;
}
void b(int *i, int *j) {}