[llvm-mca] Set the Selection strategy to Default if nullptr is passed.

* Set (not reset) the strategy in Scheduler::setCustomStrategyImpl()

llvm-svn: 340566
This commit is contained in:
Matt Davis 2018-08-23 18:42:37 +00:00
parent 851e02e52e
commit 0f70bc05b3
2 changed files with 20 additions and 7 deletions

View File

@ -24,6 +24,11 @@ using namespace llvm;
ResourceStrategy::~ResourceStrategy() = default;
void Scheduler::initializeStrategy(std::unique_ptr<SchedulerStrategy> S) {
// Ensure we have a valid (non-null) strategy object.
Strategy = S ? std::move(S) : llvm::make_unique<DefaultSchedulerStrategy>();
}
void DefaultResourceStrategy::skipMask(uint64_t Mask) {
NextInSequenceMask &= (~Mask);
if (!NextInSequenceMask) {
@ -116,7 +121,7 @@ void ResourceManager::setCustomStrategyImpl(std::unique_ptr<ResourceStrategy> S,
unsigned Index = getResourceStateIndex(ResourceID);
assert(Index < Resources.size() && "Invalid processor resource index!");
assert(S && "Unexpected null strategy in input!");
Strategies[Index].reset(S.get());
Strategies[Index] = std::move(S);
}
unsigned ResourceManager::resolveResourceMask(uint64_t Mask) const {

View File

@ -430,6 +430,11 @@ class Scheduler : public HardwareUnit {
std::vector<InstRef> ReadySet;
std::vector<InstRef> IssuedSet;
/// Verify the given selection strategy and set the Strategy member
/// accordingly. If no strategy is provided, the DefaultSchedulerStrategy is
/// used.
void initializeStrategy(std::unique_ptr<SchedulerStrategy> S);
/// Issue an instruction without updating the ready queue.
void issueInstructionImpl(
InstRef &IR,
@ -446,16 +451,19 @@ class Scheduler : public HardwareUnit {
public:
Scheduler(const llvm::MCSchedModel &Model, LSUnit *Lsu)
: LSU(Lsu), Strategy(llvm::make_unique<DefaultSchedulerStrategy>()),
Resources(llvm::make_unique<ResourceManager>(Model)) {}
: LSU(Lsu), Resources(llvm::make_unique<ResourceManager>(Model)) {
initializeStrategy(nullptr);
}
Scheduler(const llvm::MCSchedModel &Model, LSUnit *Lsu,
std::unique_ptr<SchedulerStrategy> SelectStrategy)
: LSU(Lsu), Strategy(std::move(SelectStrategy)),
Resources(llvm::make_unique<ResourceManager>(Model)) {}
: LSU(Lsu), Resources(llvm::make_unique<ResourceManager>(Model)) {
initializeStrategy(std::move(SelectStrategy));
}
Scheduler(std::unique_ptr<ResourceManager> RM, LSUnit *Lsu,
std::unique_ptr<SchedulerStrategy> SelectStrategy)
: LSU(Lsu), Strategy(std::move(SelectStrategy)),
Resources(std::move(RM)) {}
: LSU(Lsu), Resources(std::move(RM)) {
initializeStrategy(std::move(SelectStrategy));
}
// Stalls generated by the scheduler.
enum Status {