diff --git a/lib/CodeGen/SimpleHazardRecognizer.h b/lib/CodeGen/SimpleHazardRecognizer.h
index f69feaf9e57..b9038e073e4 100644
--- a/lib/CodeGen/SimpleHazardRecognizer.h
+++ b/lib/CodeGen/SimpleHazardRecognizer.h
@@ -35,6 +35,10 @@ namespace llvm {
     /// 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 @@ namespace llvm {
     /// 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 @@ namespace llvm {
       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) {