2017-06-02 01:25:02 +02:00
|
|
|
//===- lib/Codegen/MachineRegionInfo.cpp ----------------------------------===//
|
|
|
|
//
|
2019-01-19 09:50:56 +01:00
|
|
|
// 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
|
2017-06-02 01:25:02 +02:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2017-06-06 13:49:48 +02:00
|
|
|
#include "llvm/CodeGen/MachineRegionInfo.h"
|
2014-07-19 20:29:29 +02:00
|
|
|
#include "llvm/ADT/Statistic.h"
|
|
|
|
#include "llvm/Analysis/RegionInfoImpl.h"
|
2015-01-14 12:23:27 +01:00
|
|
|
#include "llvm/CodeGen/MachinePostDominators.h"
|
2018-04-30 16:59:11 +02:00
|
|
|
#include "llvm/Config/llvm-config.h"
|
Sink all InitializePasses.h includes
This file lists every pass in LLVM, and is included by Pass.h, which is
very popular. Every time we add, remove, or rename a pass in LLVM, it
caused lots of recompilation.
I found this fact by looking at this table, which is sorted by the
number of times a file was changed over the last 100,000 git commits
multiplied by the number of object files that depend on it in the
current checkout:
recompiles touches affected_files header
342380 95 3604 llvm/include/llvm/ADT/STLExtras.h
314730 234 1345 llvm/include/llvm/InitializePasses.h
307036 118 2602 llvm/include/llvm/ADT/APInt.h
213049 59 3611 llvm/include/llvm/Support/MathExtras.h
170422 47 3626 llvm/include/llvm/Support/Compiler.h
162225 45 3605 llvm/include/llvm/ADT/Optional.h
158319 63 2513 llvm/include/llvm/ADT/Triple.h
140322 39 3598 llvm/include/llvm/ADT/StringRef.h
137647 59 2333 llvm/include/llvm/Support/Error.h
131619 73 1803 llvm/include/llvm/Support/FileSystem.h
Before this change, touching InitializePasses.h would cause 1345 files
to recompile. After this change, touching it only causes 550 compiles in
an incremental rebuild.
Reviewers: bkramer, asbirlea, bollu, jdoerfert
Differential Revision: https://reviews.llvm.org/D70211
2019-11-13 22:15:01 +01:00
|
|
|
#include "llvm/InitializePasses.h"
|
2017-06-02 01:25:02 +02:00
|
|
|
#include "llvm/Pass.h"
|
|
|
|
#include "llvm/Support/Compiler.h"
|
|
|
|
#include "llvm/Support/Debug.h"
|
2014-07-19 20:29:29 +02:00
|
|
|
|
2017-02-18 01:41:16 +01:00
|
|
|
#define DEBUG_TYPE "machine-region-info"
|
2014-07-30 02:25:24 +02:00
|
|
|
|
2014-07-19 20:29:29 +02:00
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
STATISTIC(numMachineRegions, "The # of machine regions");
|
|
|
|
STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
|
|
|
|
|
|
|
|
namespace llvm {
|
2017-06-02 01:25:02 +02:00
|
|
|
|
2014-07-19 20:29:29 +02:00
|
|
|
template class RegionBase<RegionTraits<MachineFunction>>;
|
|
|
|
template class RegionNodeBase<RegionTraits<MachineFunction>>;
|
|
|
|
template class RegionInfoBase<RegionTraits<MachineFunction>>;
|
2017-06-02 01:25:02 +02:00
|
|
|
|
|
|
|
} // end namespace llvm
|
2014-07-19 20:29:29 +02:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// MachineRegion implementation
|
|
|
|
|
|
|
|
MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
|
|
|
|
MachineRegionInfo* RI,
|
|
|
|
MachineDominatorTree *DT, MachineRegion *Parent) :
|
2017-06-02 01:25:02 +02:00
|
|
|
RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {}
|
2014-07-19 20:29:29 +02:00
|
|
|
|
2017-06-02 01:25:02 +02:00
|
|
|
MachineRegion::~MachineRegion() = default;
|
2014-07-19 20:29:29 +02:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// MachineRegionInfo implementation
|
|
|
|
|
2017-06-02 01:25:02 +02:00
|
|
|
MachineRegionInfo::MachineRegionInfo() = default;
|
2014-07-19 20:29:29 +02:00
|
|
|
|
2017-06-02 01:25:02 +02:00
|
|
|
MachineRegionInfo::~MachineRegionInfo() = default;
|
2014-07-19 20:29:29 +02:00
|
|
|
|
|
|
|
void MachineRegionInfo::updateStatistics(MachineRegion *R) {
|
|
|
|
++numMachineRegions;
|
|
|
|
|
|
|
|
// TODO: Slow. Should only be enabled if -stats is used.
|
|
|
|
if (R->isSimple())
|
|
|
|
++numMachineSimpleRegions;
|
|
|
|
}
|
|
|
|
|
2014-07-20 13:14:55 +02:00
|
|
|
void MachineRegionInfo::recalculate(MachineFunction &F,
|
|
|
|
MachineDominatorTree *DT_,
|
|
|
|
MachinePostDominatorTree *PDT_,
|
|
|
|
MachineDominanceFrontier *DF_) {
|
2014-07-19 20:29:29 +02:00
|
|
|
DT = DT_;
|
|
|
|
PDT = PDT_;
|
|
|
|
DF = DF_;
|
|
|
|
|
|
|
|
MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
|
|
|
|
|
|
|
|
TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
|
|
|
|
updateStatistics(TopLevelRegion);
|
|
|
|
calculate(F);
|
|
|
|
}
|
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// MachineRegionInfoPass implementation
|
|
|
|
//
|
|
|
|
|
|
|
|
MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
|
|
|
|
initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
|
|
|
|
}
|
|
|
|
|
2017-06-02 01:25:02 +02:00
|
|
|
MachineRegionInfoPass::~MachineRegionInfoPass() = default;
|
2014-07-19 20:29:29 +02:00
|
|
|
|
|
|
|
bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
|
|
|
|
releaseMemory();
|
|
|
|
|
|
|
|
auto DT = &getAnalysis<MachineDominatorTree>();
|
|
|
|
auto PDT = &getAnalysis<MachinePostDominatorTree>();
|
|
|
|
auto DF = &getAnalysis<MachineDominanceFrontier>();
|
|
|
|
|
|
|
|
RI.recalculate(F, DT, PDT, DF);
|
2017-02-18 01:41:16 +01:00
|
|
|
|
2018-05-14 14:53:11 +02:00
|
|
|
LLVM_DEBUG(RI.dump());
|
2017-02-18 01:41:16 +01:00
|
|
|
|
2014-07-19 20:29:29 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MachineRegionInfoPass::releaseMemory() {
|
|
|
|
RI.releaseMemory();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MachineRegionInfoPass::verifyAnalysis() const {
|
|
|
|
// Only do verification when user wants to, otherwise this expensive check
|
|
|
|
// will be invoked by PMDataManager::verifyPreservedAnalysis when
|
|
|
|
// a regionpass (marked PreservedAll) finish.
|
|
|
|
if (MachineRegionInfo::VerifyRegionInfo)
|
|
|
|
RI.verifyAnalysis();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
|
|
AU.setPreservesAll();
|
2017-02-18 01:41:16 +01:00
|
|
|
AU.addRequired<MachineDominatorTree>();
|
|
|
|
AU.addRequired<MachinePostDominatorTree>();
|
|
|
|
AU.addRequired<MachineDominanceFrontier>();
|
|
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
2014-07-19 20:29:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
|
|
|
|
RI.print(OS);
|
|
|
|
}
|
|
|
|
|
2017-10-15 16:32:27 +02:00
|
|
|
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
2016-01-29 21:50:44 +01:00
|
|
|
LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
|
2014-07-19 20:29:29 +02:00
|
|
|
RI.dump();
|
|
|
|
}
|
2014-07-20 02:00:42 +02:00
|
|
|
#endif
|
2014-07-19 20:29:29 +02:00
|
|
|
|
|
|
|
char MachineRegionInfoPass::ID = 0;
|
2017-04-11 13:40:55 +02:00
|
|
|
char &MachineRegionInfoPassID = MachineRegionInfoPass::ID;
|
2014-07-19 20:29:29 +02:00
|
|
|
|
2017-02-18 01:41:16 +01:00
|
|
|
INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
|
|
|
|
"Detect single entry single exit regions", true, true)
|
2014-07-19 20:29:29 +02:00
|
|
|
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
|
|
|
|
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
|
|
|
|
INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
|
2017-02-18 01:41:16 +01:00
|
|
|
INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
|
|
|
|
"Detect single entry single exit regions", true, true)
|
2014-07-19 20:29:29 +02:00
|
|
|
|
|
|
|
// Create methods available outside of this file, to use them
|
|
|
|
// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
|
|
|
|
// the link time optimization.
|
|
|
|
|
|
|
|
namespace llvm {
|
2017-06-02 01:25:02 +02:00
|
|
|
|
|
|
|
FunctionPass *createMachineRegionInfoPass() {
|
|
|
|
return new MachineRegionInfoPass();
|
2014-07-19 20:29:29 +02:00
|
|
|
}
|
|
|
|
|
2017-06-02 01:25:02 +02:00
|
|
|
} // end namespace llvm
|