mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-16 16:16:45 +00:00
- Do away with SimpleHazardRecognizer.h. It's not used and offers little value.
- Rename ExactHazardRecognizer to PostRAHazardRecognizer and move its header to include to allow targets to extend it. llvm-svn: 105959
This commit is contained in:
parent
45c451acae
commit
358d77c810
93
include/llvm/CodeGen/PostRAHazardRecognizer.h
Normal file
93
include/llvm/CodeGen/PostRAHazardRecognizer.h
Normal file
@ -0,0 +1,93 @@
|
||||
//=- llvm/CodeGen/PostRAHazardRecognizer.h - Scheduling Support -*- C++ -*-=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the PostRAHazardRecognizer class, which
|
||||
// implements hazard-avoidance heuristics for scheduling, based on the
|
||||
// scheduling itineraries specified for the target.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_EXACTHAZARDRECOGNIZER_H
|
||||
#define LLVM_CODEGEN_EXACTHAZARDRECOGNIZER_H
|
||||
|
||||
#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
|
||||
#include "llvm/System/DataTypes.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class InstrItineraryData;
|
||||
class SUnit;
|
||||
|
||||
class PostRAHazardRecognizer : public ScheduleHazardRecognizer {
|
||||
// ScoreBoard to track function unit usage. ScoreBoard[0] is a
|
||||
// mask of the FUs in use in the cycle currently being
|
||||
// schedule. ScoreBoard[1] is a mask for the next cycle. The
|
||||
// ScoreBoard is used as a circular buffer with the current cycle
|
||||
// indicated by Head.
|
||||
class ScoreBoard {
|
||||
unsigned *Data;
|
||||
|
||||
// The maximum number of cycles monitored by the Scoreboard. This
|
||||
// value is determined based on the target itineraries to ensure
|
||||
// that all hazards can be tracked.
|
||||
size_t Depth;
|
||||
// Indices into the Scoreboard that represent the current cycle.
|
||||
size_t Head;
|
||||
public:
|
||||
ScoreBoard():Data(NULL), Depth(0), Head(0) { }
|
||||
~ScoreBoard() {
|
||||
delete[] Data;
|
||||
}
|
||||
|
||||
size_t getDepth() const { return Depth; }
|
||||
unsigned& operator[](size_t idx) const {
|
||||
assert(Depth && "ScoreBoard was not initialized properly!");
|
||||
|
||||
return Data[(Head + idx) % Depth];
|
||||
}
|
||||
|
||||
void reset(size_t d = 1) {
|
||||
if (Data == NULL) {
|
||||
Depth = d;
|
||||
Data = new unsigned[Depth];
|
||||
}
|
||||
|
||||
memset(Data, 0, Depth * sizeof(Data[0]));
|
||||
Head = 0;
|
||||
}
|
||||
|
||||
void advance() {
|
||||
Head = (Head + 1) % Depth;
|
||||
}
|
||||
|
||||
// Print the scoreboard.
|
||||
void dump() const;
|
||||
};
|
||||
|
||||
// Itinerary data for the target.
|
||||
const InstrItineraryData &ItinData;
|
||||
|
||||
ScoreBoard ReservedScoreboard;
|
||||
ScoreBoard RequiredScoreboard;
|
||||
|
||||
public:
|
||||
PostRAHazardRecognizer(const InstrItineraryData &ItinData);
|
||||
|
||||
virtual HazardType getHazardType(SUnit *SU);
|
||||
virtual void Reset();
|
||||
virtual void EmitInstruction(SUnit *SU);
|
||||
virtual void AdvanceCycle();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -1,86 +0,0 @@
|
||||
//=- llvm/CodeGen/ExactHazardRecognizer.h - Scheduling Support -*- C++ -*-=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the ExactHazardRecognizer class, which
|
||||
// implements hazard-avoidance heuristics for scheduling, based on the
|
||||
// scheduling itineraries specified for the target.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_EXACTHAZARDRECOGNIZER_H
|
||||
#define LLVM_CODEGEN_EXACTHAZARDRECOGNIZER_H
|
||||
|
||||
#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/ScheduleDAG.h"
|
||||
#include "llvm/Target/TargetInstrItineraries.h"
|
||||
|
||||
namespace llvm {
|
||||
class ExactHazardRecognizer : public ScheduleHazardRecognizer {
|
||||
// ScoreBoard to track function unit usage. ScoreBoard[0] is a
|
||||
// mask of the FUs in use in the cycle currently being
|
||||
// schedule. ScoreBoard[1] is a mask for the next cycle. The
|
||||
// ScoreBoard is used as a circular buffer with the current cycle
|
||||
// indicated by Head.
|
||||
class ScoreBoard {
|
||||
unsigned *Data;
|
||||
|
||||
// The maximum number of cycles monitored by the Scoreboard. This
|
||||
// value is determined based on the target itineraries to ensure
|
||||
// that all hazards can be tracked.
|
||||
size_t Depth;
|
||||
// Indices into the Scoreboard that represent the current cycle.
|
||||
size_t Head;
|
||||
public:
|
||||
ScoreBoard():Data(NULL), Depth(0), Head(0) { }
|
||||
~ScoreBoard() {
|
||||
delete[] Data;
|
||||
}
|
||||
|
||||
size_t getDepth() const { return Depth; }
|
||||
unsigned& operator[](size_t idx) const {
|
||||
assert(Depth && "ScoreBoard was not initialized properly!");
|
||||
|
||||
return Data[(Head + idx) % Depth];
|
||||
}
|
||||
|
||||
void reset(size_t d = 1) {
|
||||
if (Data == NULL) {
|
||||
Depth = d;
|
||||
Data = new unsigned[Depth];
|
||||
}
|
||||
|
||||
memset(Data, 0, Depth * sizeof(Data[0]));
|
||||
Head = 0;
|
||||
}
|
||||
|
||||
void advance() {
|
||||
Head = (Head + 1) % Depth;
|
||||
}
|
||||
|
||||
// Print the scoreboard.
|
||||
void dump() const;
|
||||
};
|
||||
|
||||
// Itinerary data for the target.
|
||||
const InstrItineraryData &ItinData;
|
||||
|
||||
ScoreBoard ReservedScoreboard;
|
||||
ScoreBoard RequiredScoreboard;
|
||||
|
||||
public:
|
||||
ExactHazardRecognizer(const InstrItineraryData &ItinData);
|
||||
|
||||
virtual HazardType getHazardType(SUnit *SU);
|
||||
virtual void Reset();
|
||||
virtual void EmitInstruction(SUnit *SU);
|
||||
virtual void AdvanceCycle();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -1,4 +1,4 @@
|
||||
//===----- ExactHazardRecognizer.cpp - hazard recognizer -------- ---------===//
|
||||
//===----- PostRAHazardRecognizer.cpp - hazard recognizer -------- ---------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -13,8 +13,8 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#define DEBUG_TYPE "post-RA-sched"
|
||||
#include "ExactHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/PostRAHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/ScheduleDAG.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -22,10 +22,9 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
ExactHazardRecognizer::
|
||||
ExactHazardRecognizer(const InstrItineraryData &LItinData) :
|
||||
ScheduleHazardRecognizer(), ItinData(LItinData)
|
||||
{
|
||||
PostRAHazardRecognizer::
|
||||
PostRAHazardRecognizer(const InstrItineraryData &LItinData) :
|
||||
ScheduleHazardRecognizer(), ItinData(LItinData) {
|
||||
// Determine the maximum depth of any itinerary. This determines the
|
||||
// depth of the scoreboard. We always make the scoreboard at least 1
|
||||
// cycle deep to avoid dealing with the boundary condition.
|
||||
@ -48,16 +47,16 @@ ExactHazardRecognizer(const InstrItineraryData &LItinData) :
|
||||
ReservedScoreboard.reset(ScoreboardDepth);
|
||||
RequiredScoreboard.reset(ScoreboardDepth);
|
||||
|
||||
DEBUG(dbgs() << "Using exact hazard recognizer: ScoreboardDepth = "
|
||||
DEBUG(dbgs() << "Using post-ra hazard recognizer: ScoreboardDepth = "
|
||||
<< ScoreboardDepth << '\n');
|
||||
}
|
||||
|
||||
void ExactHazardRecognizer::Reset() {
|
||||
void PostRAHazardRecognizer::Reset() {
|
||||
RequiredScoreboard.reset();
|
||||
ReservedScoreboard.reset();
|
||||
}
|
||||
|
||||
void ExactHazardRecognizer::ScoreBoard::dump() const {
|
||||
void PostRAHazardRecognizer::ScoreBoard::dump() const {
|
||||
dbgs() << "Scoreboard:\n";
|
||||
|
||||
unsigned last = Depth - 1;
|
||||
@ -73,7 +72,8 @@ void ExactHazardRecognizer::ScoreBoard::dump() const {
|
||||
}
|
||||
}
|
||||
|
||||
ExactHazardRecognizer::HazardType ExactHazardRecognizer::getHazardType(SUnit *SU) {
|
||||
PostRAHazardRecognizer::HazardType
|
||||
PostRAHazardRecognizer::getHazardType(SUnit *SU) {
|
||||
if (ItinData.isEmpty())
|
||||
return NoHazard;
|
||||
|
||||
@ -120,7 +120,7 @@ ExactHazardRecognizer::HazardType ExactHazardRecognizer::getHazardType(SUnit *SU
|
||||
return NoHazard;
|
||||
}
|
||||
|
||||
void ExactHazardRecognizer::EmitInstruction(SUnit *SU) {
|
||||
void PostRAHazardRecognizer::EmitInstruction(SUnit *SU) {
|
||||
if (ItinData.isEmpty())
|
||||
return;
|
||||
|
||||
@ -174,7 +174,7 @@ void ExactHazardRecognizer::EmitInstruction(SUnit *SU) {
|
||||
DEBUG(RequiredScoreboard.dump());
|
||||
}
|
||||
|
||||
void ExactHazardRecognizer::AdvanceCycle() {
|
||||
void PostRAHazardRecognizer::AdvanceCycle() {
|
||||
ReservedScoreboard[0] = 0; ReservedScoreboard.advance();
|
||||
RequiredScoreboard[0] = 0; RequiredScoreboard.advance();
|
||||
}
|
@ -22,8 +22,6 @@
|
||||
#include "AntiDepBreaker.h"
|
||||
#include "AggressiveAntiDepBreaker.h"
|
||||
#include "CriticalAntiDepBreaker.h"
|
||||
#include "ExactHazardRecognizer.h"
|
||||
#include "SimpleHazardRecognizer.h"
|
||||
#include "ScheduleDAGInstrs.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/LatencyPriorityQueue.h"
|
||||
@ -65,10 +63,6 @@ EnableAntiDepBreaking("break-anti-dependencies",
|
||||
cl::desc("Break post-RA scheduling anti-dependencies: "
|
||||
"\"critical\", \"all\", or \"none\""),
|
||||
cl::init("none"), cl::Hidden);
|
||||
static cl::opt<bool>
|
||||
EnablePostRAHazardAvoidance("avoid-hazards",
|
||||
cl::desc("Enable exact hazard avoidance"),
|
||||
cl::init(true), cl::Hidden);
|
||||
|
||||
// If DebugDiv > 0 then only schedule MBB with (ID % DebugDiv) == DebugMod
|
||||
static cl::opt<int>
|
||||
@ -680,15 +674,6 @@ void SchedulePostRATDList::ListScheduleTopDown() {
|
||||
ScheduleNodeTopDown(FoundSUnit, CurCycle);
|
||||
HazardRec->EmitInstruction(FoundSUnit);
|
||||
CycleHasInsts = true;
|
||||
|
||||
// If we are using the target-specific hazards, then don't
|
||||
// advance the cycle time just because we schedule a node. If
|
||||
// the target allows it we can schedule multiple nodes in the
|
||||
// same cycle.
|
||||
if (!EnablePostRAHazardAvoidance) {
|
||||
if (FoundSUnit->Latency) // Don't increment CurCycle for pseudo-ops!
|
||||
++CurCycle;
|
||||
}
|
||||
} else {
|
||||
if (CycleHasInsts) {
|
||||
DEBUG(dbgs() << "*** Finished cycle " << CurCycle << '\n');
|
||||
@ -719,16 +704,6 @@ void SchedulePostRATDList::ListScheduleTopDown() {
|
||||
#endif
|
||||
}
|
||||
|
||||
// Default implementation of CreateTargetPostRAHazardRecognizer. This should
|
||||
// be in TargetInstrInfoImpl.cpp except it reference local command line
|
||||
// option EnablePostRAHazardAvoidance
|
||||
ScheduleHazardRecognizer *TargetInstrInfoImpl::
|
||||
CreateTargetPostRAHazardRecognizer(const InstrItineraryData &II) const {
|
||||
if (EnablePostRAHazardAvoidance)
|
||||
return (ScheduleHazardRecognizer *)new ExactHazardRecognizer(II);
|
||||
return (ScheduleHazardRecognizer *)new SimpleHazardRecognizer();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Public Constructor Functions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1,101 +0,0 @@
|
||||
//=- llvm/CodeGen/SimpleHazardRecognizer.h - Scheduling Support -*- C++ -*-=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the SimpleHazardRecognizer class, which
|
||||
// implements hazard-avoidance heuristics for scheduling, based on the
|
||||
// scheduling itineraries specified for the target.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_SIMPLEHAZARDRECOGNIZER_H
|
||||
#define LLVM_CODEGEN_SIMPLEHAZARDRECOGNIZER_H
|
||||
|
||||
#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/ScheduleDAG.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
/// SimpleHazardRecognizer - A *very* simple hazard recognizer. It uses
|
||||
/// a coarse classification and attempts to avoid that instructions of
|
||||
/// a given class aren't grouped too densely together.
|
||||
class SimpleHazardRecognizer : public ScheduleHazardRecognizer {
|
||||
/// Class - A simple classification for SUnits.
|
||||
enum Class {
|
||||
Other, Load, Store
|
||||
};
|
||||
|
||||
/// Window - The Class values of the most recently issued
|
||||
/// 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();
|
||||
const TargetInstrDesc &TID = MI->getDesc();
|
||||
if (TID.mayLoad())
|
||||
return Load;
|
||||
if (TID.mayStore())
|
||||
return Store;
|
||||
return Other;
|
||||
}
|
||||
|
||||
/// Step - Rotate the existing entries in Window and insert the
|
||||
/// given class value in position as the most recent.
|
||||
void Step(Class C) {
|
||||
Window[Pos] = C;
|
||||
if (Pos == 0)
|
||||
Pos = array_lengthof(Window)-1;
|
||||
else
|
||||
--Pos;
|
||||
}
|
||||
|
||||
public:
|
||||
SimpleHazardRecognizer() : Window() {
|
||||
Reset();
|
||||
}
|
||||
|
||||
virtual HazardType getHazardType(SUnit *SU) {
|
||||
Class C = getClass(SU);
|
||||
if (C == Other)
|
||||
return NoHazard;
|
||||
|
||||
unsigned Score = 0;
|
||||
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) {
|
||||
Step(getClass(SU));
|
||||
}
|
||||
|
||||
virtual void AdvanceCycle() {
|
||||
Step(Other);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -21,6 +21,7 @@
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/PostRAHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -314,3 +315,9 @@ isReallyTriviallyReMaterializableGeneric(const MachineInstr *MI,
|
||||
// Everything checked out.
|
||||
return true;
|
||||
}
|
||||
|
||||
// Default implementation of CreateTargetPostRAHazardRecognizer.
|
||||
ScheduleHazardRecognizer *TargetInstrInfoImpl::
|
||||
CreateTargetPostRAHazardRecognizer(const InstrItineraryData &II) const {
|
||||
return (ScheduleHazardRecognizer *)new PostRAHazardRecognizer(II);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user