49#define DEBUG_TYPE "split-module" 
   57bool compareClusters(
const std::pair<unsigned, unsigned> &
A,
 
   58                     const std::pair<unsigned, unsigned> &
B) {
 
   59  if (
A.second || 
B.second)
 
   60    return A.second > 
B.second;
 
   61  return A.first > 
B.first;
 
   64using BalancingQueueType =
 
   65    std::priority_queue<std::pair<unsigned, unsigned>,
 
   66                        std::vector<std::pair<unsigned, unsigned>>,
 
   67                        decltype(compareClusters) *>;
 
   77    GVtoClusterMap.unionSets(GV, 
F);
 
   79    GVtoClusterMap.unionSets(GV, GVU);
 
 
   88  for (
const auto *U : V->users()) {
 
   91    while (!Worklist.
empty()) {
 
 
  106    GO = GI->getResolverFunction();
 
 
  121  ClusterMapType GVtoClusterMap;
 
  122  ComdatMembersType ComdatMembers;
 
  124  auto recordGVSet = [&GVtoClusterMap, &ComdatMembers](
GlobalValue &GV) {
 
  125    if (GV.isDeclaration())
 
  129      GV.setName(
"__llvmsplit_unnamed");
 
  135    if (
const Comdat *
C = GV.getComdat()) {
 
  136      auto &Member = ComdatMembers[
C];
 
  138        GVtoClusterMap.unionSets(Member, &GV);
 
  147        GVtoClusterMap.unionSets(&GV, Root);
 
  158    if (GV.hasLocalLinkage())
 
  168  BalancingQueueType BalancingQueue(compareClusters);
 
  170  for (
unsigned i = 0; i < 
N; ++i)
 
  171    BalancingQueue.push(std::make_pair(i, 0));
 
  177  for (
const auto &
C : GVtoClusterMap) {
 
  181    unsigned CurrentClusterID = BalancingQueue.top().first;
 
  182    unsigned CurrentClusterSize = BalancingQueue.top().second;
 
  183    BalancingQueue.pop();
 
  185    LLVM_DEBUG(
dbgs() << 
"Root[" << CurrentClusterID << 
"] cluster_size(" 
  186                      << std::distance(GVtoClusterMap.member_begin(*
C),
 
  187                                       GVtoClusterMap.member_end())
 
  188                      << 
") ----> " << 
C->getData()->getName() << 
"\n");
 
  190    for (ClusterMapType::member_iterator 
MI = GVtoClusterMap.findLeader(*
C);
 
  191         MI != GVtoClusterMap.member_end(); ++
MI) {
 
  192      if (!Visited.
insert(*MI).second)
 
  195                        << ((*MI)->hasLocalLinkage() ? 
" l " : 
" e ") << 
"\n");
 
  197      ClusterIDMap[*
MI] = CurrentClusterID;
 
  198      CurrentClusterSize++;
 
  201    BalancingQueue.push(std::make_pair(CurrentClusterID, CurrentClusterSize));
 
 
  214    GV->
setName(
"__llvmsplit_unnamed");
 
 
  235  return (R[0] | (R[1] << 8)) % 
N == 
I;
 
 
  240    function_ref<
void(std::unique_ptr<Module> MPart)> ModuleCallback,
 
  241    bool PreserveLocals, 
bool RoundRobin) {
 
  242  if (!PreserveLocals) {
 
  255  ClusterIDMapType ClusterIDMap;
 
  266    for (
const auto &
F : M.functions()) {
 
  267      if (
F.isDeclaration() ||
 
  270      auto It = ClusterIDMap.find(&
F);
 
  271      if (It == ClusterIDMap.end())
 
  274        ++ModuleFunctionCount[It->second];
 
  276    BalancingQueueType BalancingQueue(compareClusters);
 
  277    for (
unsigned I = 0; 
I < 
N; ++
I) {
 
  278      if (
auto It = ModuleFunctionCount.
find(
I);
 
  279          It != ModuleFunctionCount.
end())
 
  280        BalancingQueue.push(*It);
 
  282        BalancingQueue.push({
I, 0});
 
  284    for (
const auto *
const F : UnmappedFunctions) {
 
  285      const unsigned I = BalancingQueue.top().first;
 
  286      const unsigned Count = BalancingQueue.top().second;
 
  287      BalancingQueue.pop();
 
  288      ClusterIDMap.insert({
F, 
I});
 
  289      BalancingQueue.push({
I, 
Count + 1});
 
  296  for (
unsigned I = 0; 
I < 
N; ++
I) {
 
  298    std::unique_ptr<Module> MPart(
 
  300          if (
auto It = ClusterIDMap.find(GV); It != ClusterIDMap.end())
 
  301            return It->second == 
I;
 
  306      MPart->setModuleInlineAsm(
"");
 
  307    ModuleCallback(std::move(MPart));
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
This file contains the declarations for the subclasses of Constant, which represent the different fla...
 
This file defines the DenseMap class.
 
Generic implementation of equivalence classes through the use Tarjan's efficient union-find algorithm...
 
Module.h This file contains the declarations for the Module class.
 
This file defines the SmallPtrSet class.
 
This file defines the SmallVector class.
 
static bool isInPartition(const GlobalValue *GV, unsigned I, unsigned N)
 
static void addNonConstUser(ClusterMapType &GVtoClusterMap, const GlobalValue *GV, const User *U)
 
static void findPartitions(Module &M, ClusterIDMapType &ClusterIDMap, unsigned N)
 
static void externalize(GlobalValue *GV)
 
static const GlobalObject * getGVPartitioningRoot(const GlobalValue *GV)
 
static void addAllGlobalValueUsers(ClusterMapType &GVtoClusterMap, const GlobalValue *GV, const Value *V)
 
LLVM Basic Block Representation.
 
The address of a basic block.
 
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
 
LLVM_ABI bool isConstantUsed() const
Return true if the constant has users other than constant expressions and other dangling things.
 
iterator find(const_arg_type_t< KeyT > Val)
 
EquivalenceClasses - This represents a collection of equivalence classes and supports three efficient...
 
bool hasLocalLinkage() const
 
LLVM_ABI const Comdat * getComdat() const
 
void setLinkage(LinkageTypes LT)
 
LLVM_ABI const GlobalObject * getAliaseeObject() const
 
@ HiddenVisibility
The GV is hidden.
 
void setVisibility(VisibilityTypes V)
 
@ ExternalLinkage
Externally visible function.
 
A Module instance is used to store all the information related to an LLVM module.
 
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
 
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
 
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
StringRef - Represent a constant reference to a string, i.e.
 
LLVM Value Representation.
 
user_iterator user_begin()
 
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
 
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
 
An efficient, type-erasing, non-owning reference to a callable.
 
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
@ C
The default llvm calling convention, compatible with C.
 
This is an optimization pass for GlobalISel generic memory operations.
 
UnaryFunction for_each(R &&Range, UnaryFunction F)
Provide wrappers to std::for_each which take ranges instead of having to pass begin/end explicitly.
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
auto dyn_cast_or_null(const Y &Val)
 
LLVM_ABI void SplitModule(Module &M, unsigned N, function_ref< void(std::unique_ptr< Module > MPart)> ModuleCallback, bool PreserveLocals=false, bool RoundRobin=false)
Splits the module M into N linkable partitions.
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
FunctionAddr VTableAddr Count
 
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
 
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
 
LLVM_ABI std::unique_ptr< Module > CloneModule(const Module &M)
Return an exact copy of the specified module.