mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
13160fb6a6
Before this patch, loads and stores were only tracked by their corresponding queues in the LSUnit from dispatch until execute stage. In practice we should be more conservative and assume that memory opcodes leave their queues at retirement stage. Basically, loads should leave the load queue only when they have completed and delivered their data. We conservatively assume that a load is completed when it is retired. Stores should be tracked by the store queue from dispatch until retirement. In practice, stores can only leave the store queue if their data can be written to the data cache. This is mostly a mechanical change. With this patch, the retire stage notifies the LSUnit when a memory instruction is retired. That would triggers the release of LDQ/STQ entries. The only visible change is in memory tests for the bdver2 model. That is because bdver2 is the only model that defines the load/store queue size. This patch partially addresses PR39830. Differential Revision: https://reviews.llvm.org/D68266 llvm-svn: 374034
69 lines
2.7 KiB
C++
69 lines
2.7 KiB
C++
//===---------------------------- Context.cpp -------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
///
|
|
/// This file defines a class for holding ownership of various simulated
|
|
/// hardware units. A Context also provides a utility routine for constructing
|
|
/// a default out-of-order pipeline with fetch, dispatch, execute, and retire
|
|
/// stages.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MCA/Context.h"
|
|
#include "llvm/MCA/HardwareUnits/RegisterFile.h"
|
|
#include "llvm/MCA/HardwareUnits/RetireControlUnit.h"
|
|
#include "llvm/MCA/HardwareUnits/Scheduler.h"
|
|
#include "llvm/MCA/Stages/DispatchStage.h"
|
|
#include "llvm/MCA/Stages/EntryStage.h"
|
|
#include "llvm/MCA/Stages/ExecuteStage.h"
|
|
#include "llvm/MCA/Stages/MicroOpQueueStage.h"
|
|
#include "llvm/MCA/Stages/RetireStage.h"
|
|
|
|
namespace llvm {
|
|
namespace mca {
|
|
|
|
std::unique_ptr<Pipeline>
|
|
Context::createDefaultPipeline(const PipelineOptions &Opts, SourceMgr &SrcMgr) {
|
|
const MCSchedModel &SM = STI.getSchedModel();
|
|
|
|
// Create the hardware units defining the backend.
|
|
auto RCU = std::make_unique<RetireControlUnit>(SM);
|
|
auto PRF = std::make_unique<RegisterFile>(SM, MRI, Opts.RegisterFileSize);
|
|
auto LSU = std::make_unique<LSUnit>(SM, Opts.LoadQueueSize,
|
|
Opts.StoreQueueSize, Opts.AssumeNoAlias);
|
|
auto HWS = std::make_unique<Scheduler>(SM, *LSU);
|
|
|
|
// Create the pipeline stages.
|
|
auto Fetch = std::make_unique<EntryStage>(SrcMgr);
|
|
auto Dispatch = std::make_unique<DispatchStage>(STI, MRI, Opts.DispatchWidth,
|
|
*RCU, *PRF);
|
|
auto Execute =
|
|
std::make_unique<ExecuteStage>(*HWS, Opts.EnableBottleneckAnalysis);
|
|
auto Retire = std::make_unique<RetireStage>(*RCU, *PRF, *LSU);
|
|
|
|
// Pass the ownership of all the hardware units to this Context.
|
|
addHardwareUnit(std::move(RCU));
|
|
addHardwareUnit(std::move(PRF));
|
|
addHardwareUnit(std::move(LSU));
|
|
addHardwareUnit(std::move(HWS));
|
|
|
|
// Build the pipeline.
|
|
auto StagePipeline = std::make_unique<Pipeline>();
|
|
StagePipeline->appendStage(std::move(Fetch));
|
|
if (Opts.MicroOpQueueSize)
|
|
StagePipeline->appendStage(std::make_unique<MicroOpQueueStage>(
|
|
Opts.MicroOpQueueSize, Opts.DecodersThroughput));
|
|
StagePipeline->appendStage(std::move(Dispatch));
|
|
StagePipeline->appendStage(std::move(Execute));
|
|
StagePipeline->appendStage(std::move(Retire));
|
|
return StagePipeline;
|
|
}
|
|
|
|
} // namespace mca
|
|
} // namespace llvm
|