blob: f69feaf9e570d0df7669fa847ff044e5363ace90 [file] [log] [blame]
David Goodwind94a4e52009-08-10 15:55:25 +00001//=- llvm/CodeGen/SimpleHazardRecognizer.h - Scheduling Support -*- C++ -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the SimpleHazardRecognizer class, which
11// implements hazard-avoidance heuristics for scheduling, based on the
12// scheduling itineraries specified for the target.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CODEGEN_SIMPLEHAZARDRECOGNIZER_H
17#define LLVM_CODEGEN_SIMPLEHAZARDRECOGNIZER_H
18
19#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
20#include "llvm/CodeGen/ScheduleDAG.h"
21#include "llvm/Target/TargetMachine.h"
22#include "llvm/Target/TargetInstrInfo.h"
23
24namespace llvm {
25 /// SimpleHazardRecognizer - A *very* simple hazard recognizer. It uses
26 /// a coarse classification and attempts to avoid that instructions of
27 /// a given class aren't grouped too densely together.
28 class SimpleHazardRecognizer : public ScheduleHazardRecognizer {
29 /// Class - A simple classification for SUnits.
30 enum Class {
31 Other, Load, Store
32 };
33
34 /// Window - The Class values of the most recently issued
35 /// instructions.
36 Class Window[8];
37
38 /// getClass - Classify the given SUnit.
39 Class getClass(const SUnit *SU) {
40 const MachineInstr *MI = SU->getInstr();
41 const TargetInstrDesc &TID = MI->getDesc();
42 if (TID.mayLoad())
43 return Load;
44 if (TID.mayStore())
45 return Store;
46 return Other;
47 }
48
49 /// Step - Rotate the existing entries in Window and insert the
50 /// given class value in position as the most recent.
51 void Step(Class C) {
52 std::copy(Window+1, array_endof(Window), Window);
53 Window[array_lengthof(Window)-1] = C;
54 }
55
56 public:
57 SimpleHazardRecognizer() : Window() {
58 Reset();
59 }
60
61 virtual HazardType getHazardType(SUnit *SU) {
62 Class C = getClass(SU);
63 if (C == Other)
64 return NoHazard;
65 unsigned Score = 0;
66 for (unsigned i = 0; i != array_lengthof(Window); ++i)
67 if (Window[i] == C)
68 Score += i + 1;
69 if (Score > array_lengthof(Window) * 2)
70 return Hazard;
71 return NoHazard;
72 }
73
74 virtual void Reset() {
75 for (unsigned i = 0; i != array_lengthof(Window); ++i)
76 Window[i] = Other;
77 }
78
79 virtual void EmitInstruction(SUnit *SU) {
80 Step(getClass(SU));
81 }
82
83 virtual void AdvanceCycle() {
84 Step(Other);
85 }
86 };
87}
88
89#endif