OSDN Git Service

PR opt/10087
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Mar 2003 18:53:36 +0000 (18:53 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Mar 2003 18:53:36 +0000 (18:53 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64928 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/loop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20030324-1.c [new file with mode: 0644]

index 7694758..03113df 100644 (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
index 781ed37..7624b6d 100644 (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;
index 405556d..3fa3883 100644 (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
diff --git a/gcc/testsuite/gcc.dg/20030324-1.c b/gcc/testsuite/gcc.dg/20030324-1.c
new file mode 100644 (file)
index 0000000..343c721
--- /dev/null
@@ -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) {}