aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlen Nakamura <glen@imodulo.com>2003-03-27 18:53:36 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-03-27 18:53:36 +0000
commitc7d325c803cc4d985809b1b85572e0cd2c1cb5a1 (patch)
tree796445c9df0e9caa4b8e1dce2480c314d1c297fc
parentf18ab43711810de62db708d3c643664344c96aef (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/loop.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/20030324-1.c33
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
diff --git a/gcc/loop.c b/gcc/loop.c
index 781ed37..7624b6d 100644
--- a/gcc/loop.c
+++ b/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;
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) {}