speeding up ext-tsp for huge instances

Differential Revision: https://reviews.llvm.org/D120780
This commit is contained in:
spupyrev 2022-03-01 15:05:44 -08:00
parent 59814a8c99
commit bcdc047731
2 changed files with 21 additions and 2 deletions

View File

@ -201,6 +201,7 @@ static cl::opt<unsigned> TriangleChainCount(
cl::Hidden);
extern cl::opt<bool> EnableExtTspBlockPlacement;
extern cl::opt<bool> ApplyExtTspWithoutProfile;
namespace llvm {
extern cl::opt<unsigned> StaticLikelyProb;
@ -3419,7 +3420,8 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
}
// Apply a post-processing optimizing block placement.
if (MF.size() >= 3 && EnableExtTspBlockPlacement) {
if (MF.size() >= 3 && EnableExtTspBlockPlacement &&
(ApplyExtTspWithoutProfile || MF.getFunction().hasProfileData())) {
// Find a new placement and modify the layout of the blocks in the function.
applyExtTsp();

View File

@ -49,6 +49,11 @@ cl::opt<bool> EnableExtTspBlockPlacement(
cl::desc("Enable machine block placement based on the ext-tsp model, "
"optimizing I-cache utilization."));
cl::opt<bool> ApplyExtTspWithoutProfile(
"ext-tsp-apply-without-profile",
cl::desc("Whether to apply ext-tsp placement for instances w/o profile"),
cl::init(true), cl::Hidden, cl::ZeroOrMore);
// Algorithm-specific constants. The values are tuned for the best performance
// of large-scale front-end bound binaries.
static cl::opt<double>
@ -67,6 +72,12 @@ static cl::opt<unsigned> BackwardDistance(
"ext-tsp-backward-distance", cl::Hidden, cl::init(640),
cl::desc("The maximum distance (in bytes) of a backward jump for ExtTSP"));
// The maximum size of a chain created by the algorithm. The size is bounded
// so that the algorithm can efficiently process extremely large instance.
static cl::opt<unsigned>
MaxChainSize("ext-tsp-max-chain-size", cl::Hidden, cl::init(4096),
cl::desc("The maximum size of a chain to create."));
// The maximum size of a chain for splitting. Larger values of the threshold
// may yield better quality at the cost of worsen run-time.
static cl::opt<unsigned> ChainSplitThreshold(
@ -226,6 +237,8 @@ public:
const std::vector<Block *> &blocks() const { return Blocks; }
size_t numBlocks() const { return Blocks.size(); }
const std::vector<std::pair<Chain *, ChainEdge *>> &edges() const {
return Edges;
}
@ -502,7 +515,7 @@ private:
AllEdges.reserve(AllJumps.size());
for (auto &Block : AllBlocks) {
for (auto &Jump : Block.OutJumps) {
const auto SuccBlock = Jump->Target;
auto SuccBlock = Jump->Target;
auto CurEdge = Block.CurChain->getEdge(SuccBlock->CurChain);
// this edge is already present in the graph
if (CurEdge != nullptr) {
@ -592,6 +605,10 @@ private:
if (ChainPred == ChainSucc)
continue;
// Stop early if the combined chain violates the maximum allowed size
if (ChainPred->numBlocks() + ChainSucc->numBlocks() >= MaxChainSize)
continue;
// Compute the gain of merging the two chains
auto CurGain = getBestMergeGain(ChainPred, ChainSucc, ChainEdge);
if (CurGain.score() <= EPS)