diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/CMakeLists.txt | 2 | ||||
-rw-r--r-- | lib/CodeGen/ScoreboardHazardRecognizer.cpp (renamed from lib/CodeGen/PostRAHazardRecognizer.cpp) | 39 | ||||
-rw-r--r-- | lib/CodeGen/TargetInstrInfoImpl.cpp | 6 | ||||
-rw-r--r-- | lib/Target/ARM/ARMHazardRecognizer.cpp | 12 | ||||
-rw-r--r-- | lib/Target/ARM/ARMHazardRecognizer.h | 8 |
5 files changed, 41 insertions, 26 deletions
diff --git a/lib/CodeGen/CMakeLists.txt b/lib/CodeGen/CMakeLists.txt index b5c1ff7f56..70e044d225 100644 --- a/lib/CodeGen/CMakeLists.txt +++ b/lib/CodeGen/CMakeLists.txt @@ -53,7 +53,7 @@ add_llvm_library(LLVMCodeGen PHIEliminationUtils.cpp Passes.cpp PeepholeOptimizer.cpp - PostRAHazardRecognizer.cpp + ScoreboardHazardRecognizer.cpp PostRASchedulerList.cpp PreAllocSplitting.cpp ProcessImplicitDefs.cpp diff --git a/lib/CodeGen/PostRAHazardRecognizer.cpp b/lib/CodeGen/ScoreboardHazardRecognizer.cpp index 2e3919632f..d78b5d3ecb 100644 --- a/lib/CodeGen/PostRAHazardRecognizer.cpp +++ b/lib/CodeGen/ScoreboardHazardRecognizer.cpp @@ -1,4 +1,4 @@ -//===----- PostRAHazardRecognizer.cpp - hazard recognizer -------- ---------===// +//===----- ScoreboardHazardRecognizer.cpp - Scheduler Support -------------===// // // The LLVM Compiler Infrastructure // @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// // -// This implements a hazard recognizer using the instructions itineraries -// defined for the current target. +// This file implements the ScoreboardHazardRecognizer class, which +// encapsultes hazard-avoidance heuristics for scheduling, based on the +// scheduling itineraries specified for the target. // //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "post-RA-sched" -#include "llvm/CodeGen/PostRAHazardRecognizer.h" +#define DEBUG_TYPE "sched-hazard" +#include "llvm/CodeGen/ScoreboardHazardRecognizer.h" #include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -22,8 +23,8 @@ using namespace llvm; -PostRAHazardRecognizer:: -PostRAHazardRecognizer(const InstrItineraryData *LItinData) : +ScoreboardHazardRecognizer:: +ScoreboardHazardRecognizer(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 @@ -40,23 +41,26 @@ PostRAHazardRecognizer(const InstrItineraryData *LItinData) : for (; IS != E; ++IS) ItinDepth += IS->getCycles(); - ScoreboardDepth = std::max(ScoreboardDepth, ItinDepth); + // Find the next power-of-2 >= ItinDepth + while (ItinDepth > ScoreboardDepth) { + ScoreboardDepth *= 2; + } } } ReservedScoreboard.reset(ScoreboardDepth); RequiredScoreboard.reset(ScoreboardDepth); - DEBUG(dbgs() << "Using post-ra hazard recognizer: ScoreboardDepth = " + DEBUG(dbgs() << "Using scoreboard hazard recognizer: Depth = " << ScoreboardDepth << '\n'); } -void PostRAHazardRecognizer::Reset() { +void ScoreboardHazardRecognizer::Reset() { RequiredScoreboard.reset(); ReservedScoreboard.reset(); } -void PostRAHazardRecognizer::ScoreBoard::dump() const { +void ScoreboardHazardRecognizer::Scoreboard::dump() const { dbgs() << "Scoreboard:\n"; unsigned last = Depth - 1; @@ -73,7 +77,7 @@ void PostRAHazardRecognizer::ScoreBoard::dump() const { } ScheduleHazardRecognizer::HazardType -PostRAHazardRecognizer::getHazardType(SUnit *SU) { +ScoreboardHazardRecognizer::getHazardType(SUnit *SU) { if (!ItinData || ItinData->isEmpty()) return NoHazard; @@ -120,7 +124,7 @@ PostRAHazardRecognizer::getHazardType(SUnit *SU) { return NoHazard; } -void PostRAHazardRecognizer::EmitInstruction(SUnit *SU) { +void ScoreboardHazardRecognizer::EmitInstruction(SUnit *SU) { if (!ItinData || ItinData->isEmpty()) return; @@ -174,7 +178,14 @@ void PostRAHazardRecognizer::EmitInstruction(SUnit *SU) { DEBUG(RequiredScoreboard.dump()); } -void PostRAHazardRecognizer::AdvanceCycle() { +void ScoreboardHazardRecognizer::AdvanceCycle() { ReservedScoreboard[0] = 0; ReservedScoreboard.advance(); RequiredScoreboard[0] = 0; RequiredScoreboard.advance(); } + +void ScoreboardHazardRecognizer::RecedeCycle() { + ReservedScoreboard[ReservedScoreboard.getDepth()-1] = 0; + ReservedScoreboard.recede(); + RequiredScoreboard[RequiredScoreboard.getDepth()-1] = 0; + RequiredScoreboard.recede(); +} diff --git a/lib/CodeGen/TargetInstrInfoImpl.cpp b/lib/CodeGen/TargetInstrInfoImpl.cpp index cb2292d62b..baad14c5c7 100644 --- a/lib/CodeGen/TargetInstrInfoImpl.cpp +++ b/lib/CodeGen/TargetInstrInfoImpl.cpp @@ -22,7 +22,7 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineMemOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" -#include "llvm/CodeGen/PostRAHazardRecognizer.h" +#include "llvm/CodeGen/ScoreboardHazardRecognizer.h" #include "llvm/CodeGen/PseudoSourceValue.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -135,7 +135,7 @@ bool TargetInstrInfoImpl::PredicateInstruction(MachineInstr *MI, const TargetInstrDesc &TID = MI->getDesc(); if (!TID.isPredicable()) return false; - + for (unsigned j = 0, i = 0, e = MI->getNumOperands(); i != e; ++i) { if (TID.OpInfo[i].isPredicate()) { MachineOperand &MO = MI->getOperand(i); @@ -417,5 +417,5 @@ bool TargetInstrInfoImpl::isSchedulingBoundary(const MachineInstr *MI, // Default implementation of CreateTargetPostRAHazardRecognizer. ScheduleHazardRecognizer *TargetInstrInfoImpl:: CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II) const { - return (ScheduleHazardRecognizer *)new PostRAHazardRecognizer(II); + return (ScheduleHazardRecognizer *)new ScoreboardHazardRecognizer(II); } diff --git a/lib/Target/ARM/ARMHazardRecognizer.cpp b/lib/Target/ARM/ARMHazardRecognizer.cpp index 317934faec..b8d385b6e3 100644 --- a/lib/Target/ARM/ARMHazardRecognizer.cpp +++ b/lib/Target/ARM/ARMHazardRecognizer.cpp @@ -68,14 +68,14 @@ ARMHazardRecognizer::getHazardType(SUnit *SU) { } } - return PostRAHazardRecognizer::getHazardType(SU); + return ScoreboardHazardRecognizer::getHazardType(SU); } void ARMHazardRecognizer::Reset() { LastMI = 0; Stalls = 0; ITBlockSize = 0; - PostRAHazardRecognizer::Reset(); + ScoreboardHazardRecognizer::Reset(); } void ARMHazardRecognizer::EmitInstruction(SUnit *SU) { @@ -103,12 +103,16 @@ void ARMHazardRecognizer::EmitInstruction(SUnit *SU) { Stalls = 0; } - PostRAHazardRecognizer::EmitInstruction(SU); + ScoreboardHazardRecognizer::EmitInstruction(SU); } void ARMHazardRecognizer::AdvanceCycle() { if (Stalls && --Stalls == 0) // Stalled for 4 cycles but still can't schedule any other instructions. LastMI = 0; - PostRAHazardRecognizer::AdvanceCycle(); + ScoreboardHazardRecognizer::AdvanceCycle(); +} + +void ARMHazardRecognizer::RecedeCycle() { + llvm_unreachable("reverse ARM hazard checking unsupported"); } diff --git a/lib/Target/ARM/ARMHazardRecognizer.h b/lib/Target/ARM/ARMHazardRecognizer.h index d1919d8cf4..9473bc5207 100644 --- a/lib/Target/ARM/ARMHazardRecognizer.h +++ b/lib/Target/ARM/ARMHazardRecognizer.h @@ -14,7 +14,7 @@ #ifndef ARMHAZARDRECOGNIZER_H #define ARMHAZARDRECOGNIZER_H -#include "llvm/CodeGen/PostRAHazardRecognizer.h" +#include "llvm/CodeGen/ScoreboardHazardRecognizer.h" namespace llvm { @@ -23,7 +23,7 @@ class ARMBaseRegisterInfo; class ARMSubtarget; class MachineInstr; -class ARMHazardRecognizer : public PostRAHazardRecognizer { +class ARMHazardRecognizer : public ScoreboardHazardRecognizer { const ARMBaseInstrInfo &TII; const ARMBaseRegisterInfo &TRI; const ARMSubtarget &STI; @@ -38,16 +38,16 @@ public: const ARMBaseInstrInfo &tii, const ARMBaseRegisterInfo &tri, const ARMSubtarget &sti) : - PostRAHazardRecognizer(ItinData), TII(tii), TRI(tri), STI(sti), + ScoreboardHazardRecognizer(ItinData), TII(tii), TRI(tri), STI(sti), LastMI(0), ITBlockSize(0) {} virtual HazardType getHazardType(SUnit *SU); virtual void Reset(); virtual void EmitInstruction(SUnit *SU); virtual void AdvanceCycle(); + virtual void RecedeCycle(); }; - } // end namespace llvm #endif // ARMHAZARDRECOGNIZER_H |