Avoid uncessary array copying.
authorEvan Cheng <evan.cheng@apple.com>
Mon, 14 Jun 2010 20:18:40 +0000 (20:18 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 14 Jun 2010 20:18:40 +0000 (20:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105955 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SimpleHazardRecognizer.h

index f69feaf9e570d0df7669fa847ff044e5363ace90..b9038e073e47ec0272652ffb3723cb2fe1e22557 100644 (file)
@@ -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) {