diff options
author | Glen Nakamura <glen@imodulo.com> | 2003-03-27 18:53:36 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-03-27 18:53:36 +0000 |
commit | c7d325c803cc4d985809b1b85572e0cd2c1cb5a1 (patch) | |
tree | 796445c9df0e9caa4b8e1dce2480c314d1c297fc | |
parent | f18ab43711810de62db708d3c643664344c96aef (diff) | |
download | gcc-c7d325c803cc4d985809b1b85572e0cd2c1cb5a1.zip gcc-c7d325c803cc4d985809b1b85572e0cd2c1cb5a1.tar.gz gcc-c7d325c803cc4d985809b1b85572e0cd2c1cb5a1.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/loop.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20030324-1.c | 33 |
4 files changed, 61 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7694758..03113df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 405556d..3fa3883 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.dg/20030324-1.c b/gcc/testsuite/gcc.dg/20030324-1.c new file mode 100644 index 0000000..343c721 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20030324-1.c @@ -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) {} |