45#define DEBUG_TYPE "spill-code-placement" 
   52                      "Spill Code Placement Analysis", 
true, 
true)
 
  123    for (std::pair<BlockFrequency, unsigned> &L : 
Links)
 
  129    Links.push_back(std::make_pair(w, b));
 
 
  155    for (std::pair<BlockFrequency, unsigned> &L : 
Links) {
 
  156      if (nodes[L.second].Value == -1)
 
  158      else if (nodes[L.second].Value == 1)
 
  171    if (SumN >= SumP + Threshold)
 
  173    else if (SumP >= SumN + Threshold)
 
 
  181                              const Node nodes[])
 const {
 
  182    for (
const auto &Elt : 
Links) {
 
  183      unsigned n = Elt.second;
 
 
 
  192bool SpillPlacementWrapperLegacy::runOnMachineFunction(
MachineFunction &MF) {
 
  196  Impl.run(MF, Bundles, MBFI);
 
  208  Impl.run(MF, Bundles, MBFI);
 
 
  214    MachineFunctionAnalysisManager::Invalidator &Inv) {
 
 
  227void SpillPlacement::releaseMemory() {
 
  235  this->bundles = Bundles;
 
  247    unsigned Num = 
I.getNumber();
 
  253void SpillPlacement::activate(
unsigned n) {
 
  255  if (ActiveNodes->test(n))
 
  258  nodes[n].clear(Threshold);
 
  269  if (bundles->getBlocks(n).size() > 100) {
 
  270    nodes[n].BiasP = BlockFrequency(0);
 
  271    BlockFrequency BiasN = MBFI->getEntryFreq();
 
  273    nodes[n].BiasN = BiasN;
 
  285  uint64_t Freq = 
Entry.getFrequency();
 
  286  uint64_t 
Scaled = (Freq >> 13) + 
bool(Freq & (1 << 12));
 
  287  Threshold = BlockFrequency(std::max(UINT64_C(1), 
Scaled));
 
  298      unsigned ib = bundles->getBundle(LB.Number, 
false);
 
  300      nodes[ib].addBias(Freq, LB.Entry);
 
  305      unsigned ob = bundles->getBundle(LB.Number, 
true);
 
  307      nodes[ob].addBias(Freq, LB.Exit);
 
 
  314  for (
unsigned B : Blocks) {
 
  318    unsigned ib = bundles->getBundle(
B, 
false);
 
  319    unsigned ob = bundles->getBundle(
B, 
true);
 
 
  328  for (
unsigned Number : Links) {
 
  329    unsigned ib = bundles->getBundle(
Number, 
false);
 
  330    unsigned ob = bundles->getBundle(
Number, 
true);
 
  338    nodes[ib].addLink(ob, Freq);
 
  339    nodes[ob].addLink(ib, Freq);
 
 
  344  RecentPositive.clear();
 
  345  for (
unsigned n : ActiveNodes->set_bits()) {
 
  349    if (nodes[n].mustSpill())
 
  351    if (nodes[n].preferReg())
 
  352      RecentPositive.push_back(n);
 
  354  return !RecentPositive.empty();
 
 
  357bool SpillPlacement::update(
unsigned n) {
 
  360  nodes[n].getDissentingNeighbors(TodoList, 
nodes.get());
 
  369  RecentPositive.clear();
 
  375  unsigned Limit = bundles->getNumBundles() * 10;
 
  376  while(Limit-- > 0 && !TodoList.empty()) {
 
  377    unsigned n = TodoList.pop_back_val();
 
  380    if (nodes[n].preferReg())
 
  381      RecentPositive.push_back(n);
 
 
  386  RecentPositive.clear();
 
  389  ActiveNodes = &RegBundles;
 
  390  ActiveNodes->
clear();
 
  391  ActiveNodes->resize(bundles->getNumBundles());
 
 
  396  assert(ActiveNodes && 
"Call prepare() first");
 
  400  for (
unsigned n : ActiveNodes->set_bits())
 
  401    if (!nodes[n].preferReg()) {
 
  402      ActiveNodes->reset(n);
 
  405  ActiveNodes = 
nullptr;
 
 
  413    case PrefReg: 
return "PrefReg";
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
Unify divergent function exit nodes
 
This file implements the BitVector class.
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
#define INITIALIZE_PASS_DEPENDENCY(depName)
 
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
 
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
 
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
 
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
 
Represent the analysis usage information of a pass.
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
void clear()
clear - Removes all bits from the bitvector.
 
static BlockFrequency max()
Returns the maximum possible frequency, the saturation value.
 
unsigned getNumBundles() const
getNumBundles - Return the total number of bundles in the CFG.
 
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
 
LLVM_ABI BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
 
LLVM_ABI BlockFrequency getEntryFreq() const
Divide a block's BlockFrequency::getFrequency() value by this value to obtain the entry block - relat...
 
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
 
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
 
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
 
A set of analyses that are preserved following a run of a transformation pass.
 
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
SparseSet - Fast set implementation for objects that can be identified by small unsigned keys.
 
void clear()
clear - Clears the set.
 
void setUniverse(unsigned U)
setUniverse - Set the universe size which determines the largest key the set can hold.
 
SpillPlacement run(MachineFunction &, MachineFunctionAnalysisManager &)
 
void addConstraints(ArrayRef< BlockConstraint > LiveBlocks)
addConstraints - Add constraints and biases.
 
bool finish()
finish - Compute the optimal spill code placement given the constraints.
 
void addPrefSpill(ArrayRef< unsigned > Blocks, bool Strong)
addPrefSpill - Add PrefSpill constraints to all blocks listed.
 
void prepare(BitVector &RegBundles)
prepare - Reset state and prepare for a new spill placement computation.
 
bool scanActiveBundles()
scanActiveBundles - Perform an initial scan of all bundles activated by addConstraints and addLinks,...
 
bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, MachineFunctionAnalysisManager::Invalidator &Inv)
 
friend class SpillPlacementAnalysis
 
void addLinks(ArrayRef< unsigned > Links)
addLinks - Add transparent blocks with the given numbers.
 
void iterate()
iterate - Update the network iteratively until convergence, or new bundles are found.
 
BorderConstraint
BorderConstraint - A basic block has separate constraints for entry and exit.
 
@ MustSpill
A register is impossible, variable must be spilled.
 
@ DontCare
Block doesn't care / variable not live.
 
@ PrefBoth
Block entry prefers both register and stack.
 
@ PrefReg
Block entry/exit prefers a register.
 
@ PrefSpill
Block entry/exit prefers a stack slot.
 
SpillPlacement(SpillPlacement &&)
 
StringRef - Represent a constant reference to a string, i.e.
 
This class implements an extremely fast bulk output stream that can only output to a stream.
 
#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.
 
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
 
iterator_range< typename GraphTraits< GraphType >::nodes_iterator > nodes(const GraphType &G)
 
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
 
LLVM_ABI char & SpillPlacementID
SpillPlacement analysis.
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
 
Node - Each edge bundle corresponds to a Hopfield node.
 
void addBias(BlockFrequency freq, BorderConstraint direction)
addBias - Bias this node.
 
bool preferReg() const
preferReg - Return true when this node prefers to be in a register.
 
bool update(const Node nodes[], BlockFrequency Threshold)
update - Recompute Value from Bias and Links.
 
BlockFrequency SumLinkWeights
SumLinkWeights - Cached sum of the weights of all links + ThresHold.
 
BlockFrequency BiasN
BiasN - Sum of blocks that prefer a spill.
 
void addLink(unsigned b, BlockFrequency w)
addLink - Add a link to bundle b with weight w.
 
LinkVector Links
Links - (Weight, BundleNo) for all transparent blocks connecting to other bundles.
 
int Value
Value - Output value of this node computed from the Bias and links.
 
BlockFrequency BiasP
BiasP - Sum of blocks that prefer a register.
 
SmallVector< std::pair< BlockFrequency, unsigned >, 4 > LinkVector
 
void clear(BlockFrequency Threshold)
clear - Reset per-query data, but preserve frequencies that only depend on the CFG.
 
bool mustSpill() const
mustSpill - Return True if this node is so biased that it must spill.
 
void getDissentingNeighbors(SparseSet< unsigned > &List, const Node nodes[]) const
 
A special type used by analysis passes to provide an address that identifies that particular analysis...
 
BlockConstraint - Entry and exit constraints for a basic block.
 
BorderConstraint Exit
Constraint on block exit.
 
void print(raw_ostream &OS) const
 
bool ChangesValue
True when this block changes the value of the live range.
 
BorderConstraint Entry
Constraint on block entry.
 
unsigned Number
Basic block number (from MBB::getNumber()).