LLVM 20.0.0git
|
#include "RegAllocGreedy.h"
#include "AllocationOrder.h"
#include "InterferenceCache.h"
#include "RegAllocBase.h"
#include "RegAllocEvictionAdvisor.h"
#include "RegAllocPriorityAdvisor.h"
#include "SplitKit.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/IndexedMap.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/CodeGen/CalcSpillWeights.h"
#include "llvm/CodeGen/EdgeBundles.h"
#include "llvm/CodeGen/LiveDebugVariables.h"
#include "llvm/CodeGen/LiveInterval.h"
#include "llvm/CodeGen/LiveIntervalUnion.h"
#include "llvm/CodeGen/LiveIntervals.h"
#include "llvm/CodeGen/LiveRangeEdit.h"
#include "llvm/CodeGen/LiveRegMatrix.h"
#include "llvm/CodeGen/LiveStacks.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
#include "llvm/CodeGen/RegisterClassInfo.h"
#include "llvm/CodeGen/SlotIndexes.h"
#include "llvm/CodeGen/SpillPlacement.h"
#include "llvm/CodeGen/Spiller.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/CodeGen/VirtRegMap.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Pass.h"
#include "llvm/Support/BlockFrequency.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <utility>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "regalloc" |
Functions | |
STATISTIC (NumGlobalSplits, "Number of split global live ranges") | |
STATISTIC (NumLocalSplits, "Number of split local live ranges") | |
STATISTIC (NumEvicted, "Number of interferences evicted") | |
INITIALIZE_PASS_BEGIN (RAGreedy, "greedy", "Greedy Register Allocator", false, false) INITIALIZE_PASS_END(RAGreedy | |
static unsigned | getNumAllocatableRegsForConstraints (const MachineInstr *MI, Register Reg, const TargetRegisterClass *SuperRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, const RegisterClassInfo &RCI) |
Get the number of allocatable registers that match the constraints of Reg on MI and that are also in SuperRC . | |
static LaneBitmask | getInstReadLaneMask (const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, const MachineInstr &FirstMI, Register Reg) |
static bool | readsLaneSubset (const MachineRegisterInfo &MRI, const MachineInstr *MI, const LiveInterval &VirtReg, const TargetRegisterInfo *TRI, SlotIndex Use, const TargetInstrInfo *TII) |
Return true if MI at \P Use reads a subset of the lanes live in VirtReg . | |
static bool | hasTiedDef (MachineRegisterInfo *MRI, unsigned reg) |
Return true if reg has any tied def operand. | |
static bool | assignedRegPartiallyOverlaps (const TargetRegisterInfo &TRI, const VirtRegMap &VRM, MCRegister PhysReg, const LiveInterval &Intf) |
Return true if the existing assignment of Intf overlaps, but is not the same, as PhysReg . | |
Variables | |
static cl::opt< SplitEditor::ComplementSpillMode > | SplitSpillMode ("split-spill-mode", cl::Hidden, cl::desc("Spill mode for splitting live ranges"), cl::values(clEnumValN(SplitEditor::SM_Partition, "default", "Default"), clEnumValN(SplitEditor::SM_Size, "size", "Optimize for size"), clEnumValN(SplitEditor::SM_Speed, "speed", "Optimize for speed")), cl::init(SplitEditor::SM_Speed)) |
static cl::opt< unsigned > | LastChanceRecoloringMaxDepth ("lcr-max-depth", cl::Hidden, cl::desc("Last chance recoloring max depth"), cl::init(5)) |
static cl::opt< unsigned > | LastChanceRecoloringMaxInterference ("lcr-max-interf", cl::Hidden, cl::desc("Last chance recoloring maximum number of considered" " interference at a time"), cl::init(8)) |
static cl::opt< bool > | ExhaustiveSearch ("exhaustive-register-search", cl::NotHidden, cl::desc("Exhaustive Search for registers bypassing the depth " "and interference cutoffs of last chance recoloring"), cl::Hidden) |
static cl::opt< bool > | EnableDeferredSpilling ("enable-deferred-spilling", cl::Hidden, cl::desc("Instead of spilling a variable right away, defer the actual " "code insertion to the end of the allocation. That way the " "allocator might still find a suitable coloring for this " "variable because of other evicted variables."), cl::init(false)) |
static cl::opt< unsigned > | CSRFirstTimeCost ("regalloc-csr-first-time-cost", cl::desc("Cost for first time use of callee-saved register."), cl::init(0), cl::Hidden) |
static cl::opt< unsigned long > | GrowRegionComplexityBudget ("grow-region-complexity-budget", cl::desc("growRegion() does not scale with the number of BB edges, so " "limit its budget and bail out once we reach the limit."), cl::init(10000), cl::Hidden) |
static cl::opt< bool > | GreedyRegClassPriorityTrumpsGlobalness ("greedy-regclass-priority-trumps-globalness", cl::desc("Change the greedy register allocator's live range priority " "calculation to make the AllocationPriority of the register class " "more important then whether the range is global"), cl::Hidden) |
static cl::opt< bool > | GreedyReverseLocalAssignment ("greedy-reverse-local-assignment", cl::desc("Reverse allocation order of local live ranges, such that " "shorter local live ranges will tend to be allocated first"), cl::Hidden) |
static cl::opt< unsigned > | SplitThresholdForRegWithHint ("split-threshold-for-reg-with-hint", cl::desc("The threshold for splitting a virtual register with a hint, in " "percentate"), cl::init(75), cl::Hidden) |
static RegisterRegAlloc | greedyRegAlloc ("greedy", "greedy register allocator", createGreedyRegisterAllocator) |
greedy | |
Greedy Register | Allocator |
Greedy Register | false |
const float | Hysteresis = (2007 / 2048.0f) |
#define DEBUG_TYPE "regalloc" |
Definition at line 76 of file RegAllocGreedy.cpp.
|
static |
Return true if the existing assignment of Intf
overlaps, but is not the same, as PhysReg
.
Definition at line 1846 of file RegAllocGreedy.cpp.
References llvm::VirtRegMap::getPhys(), llvm::LiveInterval::reg(), llvm::TargetRegisterInfo::regsOverlap(), llvm::RegAllocBase::TRI, and llvm::RegAllocBase::VRM.
|
static |
Definition at line 1347 of file RegAllocGreedy.cpp.
References llvm::AnalyzeVirtRegInBundle(), assert(), llvm::MachineRegisterInfo::getMaxLaneMaskForVReg(), llvm::MachineOperand::getReg(), llvm::MachineOperand::getSubReg(), llvm::TargetRegisterInfo::getSubRegIndexLaneMask(), llvm::MachineOperand::isDef(), llvm::MachineOperand::isReg(), llvm::MachineOperand::isUndef(), llvm::MachineOperand::isUse(), MI, llvm::RegAllocBase::MRI, SubReg, and llvm::RegAllocBase::TRI.
Referenced by readsLaneSubset().
|
static |
Get the number of allocatable registers that match the constraints of Reg
on MI
and that are also in SuperRC
.
Definition at line 1333 of file RegAllocGreedy.cpp.
References assert(), llvm::RegisterClassInfo::getNumAllocatableRegs(), MI, TII, and llvm::RegAllocBase::TRI.
|
static |
Return true if reg
has any tied def operand.
Definition at line 1836 of file RegAllocGreedy.cpp.
References llvm::MachineRegisterInfo::def_operands(), and llvm::RegAllocBase::MRI.
|
static |
Return true if MI
at \P Use reads a subset of the lanes live in VirtReg
.
Definition at line 1378 of file RegAllocGreedy.cpp.
References llvm::LaneBitmask::any(), llvm::TargetRegisterInfo::getCoveringLanes(), getInstReadLaneMask(), MI, llvm::RegAllocBase::MRI, llvm::LiveInterval::reg(), llvm::LiveInterval::subranges(), TII, and llvm::RegAllocBase::TRI.
STATISTIC | ( | NumEvicted | , |
"Number of interferences evicted" | |||
) |
STATISTIC | ( | NumGlobalSplits | , |
"Number of split global live ranges" | |||
) |
STATISTIC | ( | NumLocalSplits | , |
"Number of split local live ranges" | |||
) |
Greedy Register Allocator |
Definition at line 170 of file RegAllocGreedy.cpp.
|
static |
|
static |
|
static |
Greedy Register false |
Definition at line 170 of file RegAllocGreedy.cpp.
greedy |
Definition at line 169 of file RegAllocGreedy.cpp.
|
static |
|
static |
Referenced by llvm::RAGreedy::runOnMachineFunction().
|
static |
Referenced by llvm::RAGreedy::runOnMachineFunction().
|
static |
const float Hysteresis = (2007 / 2048.0f) |
Definition at line 186 of file RegAllocGreedy.cpp.
|
static |
|
static |
|
static |
|
static |