From 847dde9555b9dc852d1de2678c99496b498446cc Mon Sep 17 00:00:00 2001
From: Bernd Schmidt <bernds@redhat.co.uk>
Date: Tue, 21 Nov 2000 18:24:42 +0000
Subject: [PATCH] Fix consec_sets_giv bug.

From-SVN: r37619
---
 gcc/ChangeLog | 4 ++++
 gcc/loop.c    | 9 +++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d781a13ff4b5..3ac3a3fb3a3e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
 2000-11-21  Bernd Schmidt  <bernds@redhat.co.uk>
 
+	* loop.c (consec_sets_giv): If the reg we're examining is anything
+	but UNKNOWN_INDUCT, do nothing.
+	Reset the reg's type to UNKNOWN_INDUCT before returning.
+
 	Mostly from Vladimir Makarov (vmakarov@redhat.com)
 	* ia64.md (attr itanium_class): Define insn types as described in
 	Itanium docs.
diff --git a/gcc/loop.c b/gcc/loop.c
index 267c4691afcb..a514d051113f 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -6203,8 +6203,12 @@ consec_sets_giv (loop, first_benefit, p, src_reg, dest_reg,
      general_induction_var below, so we can allocate it on our stack.
      If this is a giv, our caller will replace the induct var entry with
      a new induction structure.  */
-  struct induction *v
-    = (struct induction *) alloca (sizeof (struct induction));
+  struct induction *v;
+
+  if (REG_IV_TYPE (ivs, REGNO (dest_reg)) != UNKNOWN_INDUCT)
+    return 0;
+
+  v = (struct induction *) alloca (sizeof (struct induction));
   v->src_reg = src_reg;
   v->mult_val = *mult_val;
   v->add_val = *add_val;
@@ -6265,6 +6269,7 @@ consec_sets_giv (loop, first_benefit, p, src_reg, dest_reg,
 	}
     }
 
+  REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
   *last_consec_insn = p;
   return v->benefit;
 }
-- 
GitLab