re PR tree-optimization/16807 ([lno] Weird loop unrolling)
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Fri, 6 Aug 2004 09:40:39 +0000 (11:40 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Fri, 6 Aug 2004 09:40:39 +0000 (09:40 +0000)
PR tree-optimization/16807
* loop-iv.c (dump_iv_info): Dump invariants correctly.
(iv_subreg, iv_extend): Express value of invariant purely in
base field.

From-SVN: r85634

gcc/ChangeLog
gcc/loop-iv.c

index 53bfd1f46e3304104474acdadf1a0f2508a167c0..d83bdbe2e66da8ce7dc21816d5a885259127915b 100644 (file)
@@ -1,3 +1,10 @@
+2004-08-06  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       PR tree-optimization/16807
+       * loop-iv.c (dump_iv_info): Dump invariants correctly.
+       (iv_subreg, iv_extend): Express value of invariant purely in
+       base field.
+
 2004-08-06  Mark Mitchell  <mark@codesourcery.com>
 
        * config/arm/symbian.h (CC1_SPEC): Add -fno-short-enums.
index 5feb050431203f8477e5a3f637d7c1509cab3b27..0a01f86cb436e6eeab8908114cd88d1e627b4f95 100644 (file)
@@ -104,17 +104,17 @@ dump_iv_info (FILE *file, struct rtx_iv *iv)
       return;
     }
 
-  if (iv->step == const0_rtx)
-    {
-      fprintf (file, "invariant ");
-      print_rtl (file, iv->base);
-      return;
-    }
+  if (iv->step == const0_rtx
+      && !iv->first_special)
+    fprintf (file, "invariant ");
 
   print_rtl (file, iv->base);
-  fprintf (file, " + ");
-  print_rtl (file, iv->step);
-  fprintf (file, " * iteration");
+  if (iv->step != const0_rtx)
+    {
+      fprintf (file, " + ");
+      print_rtl (file, iv->step);
+      fprintf (file, " * iteration");
+    }
   fprintf (file, " (in %s)", GET_MODE_NAME (iv->mode));
 
   if (iv->mode != iv->extend_mode)
@@ -440,6 +440,21 @@ iv_constant (struct rtx_iv *iv, rtx cst, enum machine_mode mode)
 static bool
 iv_subreg (struct rtx_iv *iv, enum machine_mode mode)
 {
+  /* If iv is invariant, just calculate the new value.  */
+  if (iv->step == const0_rtx
+      && !iv->first_special)
+    {
+      rtx val = get_iv_value (iv, const0_rtx);
+      val = lowpart_subreg (mode, val, iv->extend_mode);
+
+      iv->base = val;
+      iv->extend = NIL;
+      iv->mode = iv->extend_mode = mode;
+      iv->delta = const0_rtx;
+      iv->mult = const1_rtx;
+      return true;
+    }
+
   if (iv->extend_mode == mode)
     return true;
 
@@ -465,6 +480,21 @@ iv_subreg (struct rtx_iv *iv, enum machine_mode mode)
 static bool
 iv_extend (struct rtx_iv *iv, enum rtx_code extend, enum machine_mode mode)
 {
+  /* If iv is invariant, just calculate the new value.  */
+  if (iv->step == const0_rtx
+      && !iv->first_special)
+    {
+      rtx val = get_iv_value (iv, const0_rtx);
+      val = simplify_gen_unary (extend, mode, val, iv->extend_mode);
+
+      iv->base = val;
+      iv->extend = NIL;
+      iv->mode = iv->extend_mode = mode;
+      iv->delta = const0_rtx;
+      iv->mult = const1_rtx;
+      return true;
+    }
+
   if (mode != iv->extend_mode)
     return false;