diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-06-14 20:18:40 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-06-14 20:18:40 +0000 |
commit | 0b5007ad4a5374ca356440b453b39c7036af7745 (patch) | |
tree | 032914997bc09fde5d42f20a9a094e2cebea1dff /lib | |
parent | 60ad7f2b58b2a8f9c1fc7063c940a0c073a32171 (diff) | |
download | external_llvm-0b5007ad4a5374ca356440b453b39c7036af7745.zip external_llvm-0b5007ad4a5374ca356440b453b39c7036af7745.tar.gz external_llvm-0b5007ad4a5374ca356440b453b39c7036af7745.tar.bz2 |
Avoid uncessary array copying.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105955 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SimpleHazardRecognizer.h | 26 |
1 files changed, 19 insertions, 7 deletions
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 @@ 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) { |