aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2010-06-14 20:18:40 +0000
committerEvan Cheng <evan.cheng@apple.com>2010-06-14 20:18:40 +0000
commit0b5007ad4a5374ca356440b453b39c7036af7745 (patch)
tree032914997bc09fde5d42f20a9a094e2cebea1dff /lib
parent60ad7f2b58b2a8f9c1fc7063c940a0c073a32171 (diff)
downloadexternal_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.h26
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) {