From 538ccb0d997ce310cd177b562e7b4baa0dad583c Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 14 Jun 2010 20:18:40 +0000 Subject: [PATCH] Avoid uncessary array copying. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105955 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SimpleHazardRecognizer.h | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) 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) {