diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 76947581cefd9b6fc8216609bb48cd0e6931c037..03113df8678a953fd860ea20236faa55fb97f20b 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 781ed3725144b437daff3f199e5cab6e1130f54d..7624b6d6a03887ea39b40c3c597200b67b55b7a2 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 405556d9d81891dd0810dfcbad36f32a3b06658d..3fa38837c3d6f0c6f00aae2c4c18327b61527fe1 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 0000000000000000000000000000000000000000..343c721dc6432c0fba4918dd1f2fce7f63b4e115
--- /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) {}