Avoid uncessary array copying.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105955 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SimpleHazardRecognizer.h b/lib/CodeGen/SimpleHazardRecognizer.h
index f69feaf..b9038e0 100644
--- a/lib/CodeGen/SimpleHazardRecognizer.h
+++ b/lib/CodeGen/SimpleHazardRecognizer.h
@@ -35,6 +35,10 @@
     /// instructions.
     Class Window[8];
 
+    /// Pos - Current position pointing into Window.
+    ///
+    unsigned Pos;
+
     /// getClass - Classify the given SUnit.
     Class getClass(const SUnit *SU) {
       const MachineInstr *MI = SU->getInstr();
@@ -49,8 +53,11 @@
     /// Step - Rotate the existing entries in Window and insert the
     /// given class value in position as the most recent.
     void Step(Class C) {
-      std::copy(Window+1, array_endof(Window), Window);
-      Window[array_lengthof(Window)-1] = C;
+      Window[Pos] = C;
+      if (Pos == 0)
+        Pos = array_lengthof(Window)-1;
+      else
+        --Pos;
     }
 
   public:
@@ -62,18 +69,23 @@
       Class C = getClass(SU);
       if (C == Other)
         return NoHazard;
+
       unsigned Score = 0;
-      for (unsigned i = 0; i != array_lengthof(Window); ++i)
-        if (Window[i] == C)
-          Score += i + 1;
-      if (Score > array_lengthof(Window) * 2)
-        return Hazard;
+      for (unsigned i = array_lengthof(Window); i != 0; --i) {
+        unsigned RealPos = (Pos + (i-1)) % array_lengthof(Window);
+        if (Window[RealPos] == C) {
+          Score += i;
+          if (Score > array_lengthof(Window) * 2)
+            return Hazard;
+        }
+      }
       return NoHazard;
     }
 
     virtual void Reset() {
       for (unsigned i = 0; i != array_lengthof(Window); ++i)
         Window[i] = Other;
+      Pos = array_lengthof(Window)-1;
     }
 
     virtual void EmitInstruction(SUnit *SU) {