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:
parent
f18ab43711
commit
c7d325c803
4 changed files with 61 additions and 0 deletions
|
@ -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
|
||||
|
|
15
gcc/loop.c
15
gcc/loop.c
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
33
gcc/testsuite/gcc.dg/20030324-1.c
Normal file
33
gcc/testsuite/gcc.dg/20030324-1.c
Normal 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) {}
|
Loading…
Add table
Reference in a new issue