40#define DEBUG_TYPE "wasm-reg-stackify" 
   47    return "WebAssembly Register Stackify";
 
   74char WebAssemblyRegStackify::ID = 0;
 
   76                "Reorder instructions to use the WebAssembly value stack",
 
   80  return new WebAssemblyRegStackify(OptLevel);
 
 
   88  if (!
MI->definesRegister(WebAssembly::VALUE_STACK, 
nullptr))
 
   94  if (!
MI->readsRegister(WebAssembly::VALUE_STACK, 
nullptr))
 
 
  106  assert(
MI->getOpcode() == TargetOpcode::IMPLICIT_DEF);
 
  108  const auto *RegClass = 
MRI.getRegClass(
MI->getOperand(0).getReg());
 
  109  if (RegClass == &WebAssembly::I32RegClass) {
 
  110    MI->setDesc(
TII->get(WebAssembly::CONST_I32));
 
  112  } 
else if (RegClass == &WebAssembly::I64RegClass) {
 
  113    MI->setDesc(
TII->get(WebAssembly::CONST_I64));
 
  115  } 
else if (RegClass == &WebAssembly::F32RegClass) {
 
  116    MI->setDesc(
TII->get(WebAssembly::CONST_F32));
 
  120  } 
else if (RegClass == &WebAssembly::F64RegClass) {
 
  121    MI->setDesc(
TII->get(WebAssembly::CONST_F64));
 
  125  } 
else if (RegClass == &WebAssembly::V128RegClass) {
 
  126    MI->setDesc(
TII->get(WebAssembly::CONST_V128_I64x2));
 
 
  138                        bool &Effects, 
bool &StackPointer) {
 
  146      if (!GA->isInterposable())
 
  147        GV = GA->getAliasee();
 
  150      if (!
F->doesNotThrow())
 
  152      if (
F->doesNotAccessMemory())
 
  154      if (
F->onlyReadsMemory()) {
 
 
  170                  bool &Effects, 
bool &StackPointer) {
 
  173  if (
MI.isDebugInstr() || 
MI.isPosition())
 
  177  if (
MI.mayLoad() && !
MI.isDereferenceableInvariantLoad())
 
  183  } 
else if (
MI.hasOrderedMemoryRef()) {
 
  184    switch (
MI.getOpcode()) {
 
  185    case WebAssembly::DIV_S_I32:
 
  186    case WebAssembly::DIV_S_I64:
 
  187    case WebAssembly::REM_S_I32:
 
  188    case WebAssembly::REM_S_I64:
 
  189    case WebAssembly::DIV_U_I32:
 
  190    case WebAssembly::DIV_U_I64:
 
  191    case WebAssembly::REM_U_I32:
 
  192    case WebAssembly::REM_U_I64:
 
  193    case WebAssembly::I32_TRUNC_S_F32:
 
  194    case WebAssembly::I64_TRUNC_S_F32:
 
  195    case WebAssembly::I32_TRUNC_S_F64:
 
  196    case WebAssembly::I64_TRUNC_S_F64:
 
  197    case WebAssembly::I32_TRUNC_U_F32:
 
  198    case WebAssembly::I64_TRUNC_U_F32:
 
  199    case WebAssembly::I32_TRUNC_U_F64:
 
  200    case WebAssembly::I64_TRUNC_U_F64:
 
  218  if (
MI.hasUnmodeledSideEffects()) {
 
  219    switch (
MI.getOpcode()) {
 
  220    case WebAssembly::DIV_S_I32:
 
  221    case WebAssembly::DIV_S_I64:
 
  222    case WebAssembly::REM_S_I32:
 
  223    case WebAssembly::REM_S_I64:
 
  224    case WebAssembly::DIV_U_I32:
 
  225    case WebAssembly::DIV_U_I64:
 
  226    case WebAssembly::REM_U_I32:
 
  227    case WebAssembly::REM_U_I64:
 
  228    case WebAssembly::I32_TRUNC_S_F32:
 
  229    case WebAssembly::I64_TRUNC_S_F32:
 
  230    case WebAssembly::I32_TRUNC_S_F64:
 
  231    case WebAssembly::I64_TRUNC_S_F64:
 
  232    case WebAssembly::I32_TRUNC_U_F32:
 
  233    case WebAssembly::I64_TRUNC_U_F32:
 
  234    case WebAssembly::I32_TRUNC_U_F64:
 
  235    case WebAssembly::I64_TRUNC_U_F64:
 
  248  if ((
MI.getOpcode() == WebAssembly::GLOBAL_SET_I32 ||
 
  249       MI.getOpcode() == WebAssembly::GLOBAL_SET_I64) &&
 
  250      MI.getOperand(0).isSymbol() &&
 
  251      !strcmp(
MI.getOperand(0).getSymbolName(), 
"__stack_pointer"))
 
 
  263  return Def.isAsCheapAsAMove() && 
TII->isTriviallyReMaterializable(Def);
 
 
  277  if (LIS != 
nullptr) {
 
 
  305  if (
MRI.hasOneNonDBGUse(
Reg))
 
  316  for (
auto &
I : 
MRI.use_nodbg_operands(
Reg)) {
 
  318    if (Result.valueIn() == DefVNI) {
 
  319      if (!Result.isKill())
 
 
  365    for (; 
I != 
E; ++
I) {
 
  366      for (
const auto &PriorUse : 
I->uses()) {
 
  367        if (&PriorUse == 
Use)
 
  369        if (PriorUse.isReg() && SubsequentDef.getReg() == PriorUse.getReg())
 
  378  for (
auto E = 
MBB->end(); NextI != 
E && NextI->isDebugInstr(); ++NextI)
 
  397    if (!MO.isReg() || MO.isUndef())
 
  402    if (MO.isDead() && Insert->definesRegister(
Reg, 
nullptr) &&
 
  403        !Insert->readsRegister(
Reg, 
nullptr))
 
  406    if (
Reg.isPhysical()) {
 
  409      if (
Reg == WebAssembly::ARGUMENTS)
 
  412      if (!
MRI.isPhysRegModified(
Reg))
 
  421    if (!MO.isDef() && !
MRI.hasOneDef(
Reg))
 
  425  bool Read = 
false, 
Write = 
false, Effects = 
false, StackPointer = 
false;
 
  430  bool HasMutableRegisters = !MutableRegisters.
empty();
 
  431  if (!
Read && !
Write && !Effects && !StackPointer && !HasMutableRegisters)
 
  436  for (--
I; 
I != 
D; --
I) {
 
  437    bool InterveningRead = 
false;
 
  438    bool InterveningWrite = 
false;
 
  439    bool InterveningEffects = 
false;
 
  440    bool InterveningStackPointer = 
false;
 
  441    query(*
I, InterveningRead, InterveningWrite, InterveningEffects,
 
  442          InterveningStackPointer);
 
  443    if (Effects && InterveningEffects)
 
  445    if (
Read && InterveningWrite)
 
  447    if (
Write && (InterveningRead || InterveningWrite))
 
  449    if (StackPointer && InterveningStackPointer)
 
  452    for (
unsigned Reg : MutableRegisters)
 
  454        if (MO.isReg() && MO.isDef() && MO.getReg() == 
Reg)
 
 
  480    if (UseVNI != OneUseVNI)
 
  483    if (UseInst == OneUseInst) {
 
  490      while (!MDT.
dominates(OneUseInst, UseInst)) {
 
  507        if (NewUseInst == OneUseInst) {
 
  508          if (&OneUse > &NewUse)
 
  512        UseInst = NewUseInst;
 
 
  521  if (RC == &WebAssembly::I32RegClass)
 
  522    return WebAssembly::TEE_I32;
 
  523  if (RC == &WebAssembly::I64RegClass)
 
  524    return WebAssembly::TEE_I64;
 
  525  if (RC == &WebAssembly::F32RegClass)
 
  526    return WebAssembly::TEE_F32;
 
  527  if (RC == &WebAssembly::F64RegClass)
 
  528    return WebAssembly::TEE_F64;
 
  529  if (RC == &WebAssembly::V128RegClass)
 
  530    return WebAssembly::TEE_V128;
 
  531  if (RC == &WebAssembly::EXTERNREFRegClass)
 
  532    return WebAssembly::TEE_EXTERNREF;
 
  533  if (RC == &WebAssembly::FUNCREFRegClass)
 
  534    return WebAssembly::TEE_FUNCREF;
 
  535  if (RC == &WebAssembly::EXNREFRegClass)
 
  536    return WebAssembly::TEE_EXNREF;
 
 
  573    if (LIS != 
nullptr) {
 
 
  593  for (
auto *
I = 
MI->getPrevNode(); 
I; 
I = 
I->getPrevNode())
 
  594    if (!
I->isDebugInstr())
 
 
  671  const auto *RegClass = 
MRI.getRegClass(
Reg);
 
  672  Register TeeReg = 
MRI.createVirtualRegister(RegClass);
 
  673  Register DefReg = 
MRI.createVirtualRegister(RegClass);
 
 
  721class TreeWalkerState {
 
  723  using mop_reverse_iterator = std::reverse_iterator<mop_iterator>;
 
  724  using RangeTy = iterator_range<mop_reverse_iterator>;
 
  728  explicit TreeWalkerState(MachineInstr *Insert) {
 
  729    const iterator_range<mop_iterator> &
Range = 
Insert->explicit_uses();
 
  734  bool done()
 const { 
return Worklist.empty(); }
 
  736  MachineOperand &pop() {
 
  737    RangeTy &
Range = Worklist.back();
 
  738    MachineOperand &
Op = *
Range.begin();
 
  742    assert((Worklist.empty() || !Worklist.back().empty()) &&
 
  743           "Empty ranges shouldn't remain in the worklist");
 
  748  void pushOperands(MachineInstr *Instr) {
 
  749    const iterator_range<mop_iterator> &
Range(
Instr->explicit_uses());
 
  756  void resetTopOperands(MachineInstr *Instr) {
 
  757    assert(hasRemainingOperands(Instr) &&
 
  758           "Reseting operands should only be done when the instruction has " 
  759           "an operand still on the stack");
 
  765  bool hasRemainingOperands(
const MachineInstr *Instr)
 const {
 
  766    if (Worklist.empty())
 
  768    const RangeTy &
Range = Worklist.back();
 
  778  bool isOnStack(
unsigned Reg)
 const {
 
  779    for (
const RangeTy &
Range : Worklist)
 
  780      for (
const MachineOperand &MO : 
Range)
 
  781        if (MO.isReg() && MO.getReg() == 
Reg)
 
  789class CommutingState {
 
  795  bool TentativelyCommuting = 
false;
 
  796  bool Declined = 
false;
 
  800  unsigned Operand0, Operand1;
 
  806  void maybeCommute(MachineInstr *Insert, TreeWalkerState &TreeWalker,
 
  807                    const WebAssemblyInstrInfo *
TII) {
 
  808    if (TentativelyCommuting) {
 
  810             "Don't decline commuting until you've finished trying it");
 
  812      TII->commuteInstruction(*Insert, 
false, Operand0, Operand1);
 
  813      TentativelyCommuting = 
false;
 
  815    } 
else if (!Declined && TreeWalker.hasRemainingOperands(Insert)) {
 
  818      if (
TII->findCommutedOpIndices(*Insert, Operand0, Operand1)) {
 
  820        TII->commuteInstruction(*Insert, 
false, Operand0, Operand1);
 
  821        TreeWalker.resetTopOperands(Insert);
 
  822        TentativelyCommuting = 
true;
 
  831    TentativelyCommuting = 
false;
 
  837bool WebAssemblyRegStackify::runOnMachineFunction(
MachineFunction &MF) {
 
  838  LLVM_DEBUG(
dbgs() << 
"********** Register Stackifying **********\n" 
  839                       "********** Function: " 
  844  WebAssemblyFunctionInfo &MFI = *MF.
getInfo<WebAssemblyFunctionInfo>();
 
  845  const auto *
TII = MF.
getSubtarget<WebAssemblySubtarget>().getInstrInfo();
 
  846  MachineDominatorTree *MDT = 
nullptr;
 
  847  LiveIntervals *LIS = 
nullptr;
 
  849    MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
 
  850    LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
 
  856  for (MachineBasicBlock &
MBB : MF) {
 
  860      MachineInstr *
Insert = &*MII;
 
  863      if (
Insert->isInlineAsm())
 
  867      if (
Insert->isDebugValue())
 
  876      CommutingState Commuting;
 
  877      TreeWalkerState TreeWalker(Insert);
 
  878      while (!TreeWalker.done()) {
 
  879        MachineOperand &
Use = TreeWalker.pop();
 
  886        assert(
Use.isUse() && 
"explicit_uses() should only iterate over uses");
 
  888               "explicit_uses() should only iterate over explicit operands");
 
  907        MachineOperand *
Def =
 
  918        bool CanMove = SameBlock &&
 
  920                       !TreeWalker.isOnStack(
Reg);
 
  930                "Stackifying away frame base in unoptimized code not expected");
 
  944          if (!CanMove && SameBlock)
 
  945            Commuting.maybeCommute(Insert, TreeWalker, 
TII);
 
  953        auto *SubsequentDef = 
Insert->defs().begin();
 
  954        auto *SubsequentUse = &
Use;
 
  955        while (SubsequentDef != 
Insert->defs().end() &&
 
  956               SubsequentUse != 
Use.getParent()->uses().end()) {
 
  957          if (!SubsequentDef->isReg() || !SubsequentUse->isReg())
 
  959          Register DefReg = SubsequentDef->getReg();
 
  973        if (
Insert->getOpcode() == TargetOpcode::IMPLICIT_DEF)
 
  979        TreeWalker.pushOperands(Insert);
 
  984      if (Insert != &*MII) {
 
  995    MF.getRegInfo().addLiveIn(WebAssembly::VALUE_STACK);
 
  996    for (MachineBasicBlock &
MBB : MF)
 
 1002  SmallVector<unsigned, 0> 
Stack;
 
 1003  for (MachineBasicBlock &
MBB : MF) {
 
 1004    for (MachineInstr &
MI : 
MBB) {
 
 1005      if (
MI.isDebugInstr())
 
 1007      for (MachineOperand &MO : 
reverse(
MI.explicit_uses())) {
 
 1013                 "Register stack pop should be paired with a push");
 
 1015      for (MachineOperand &MO : 
MI.defs()) {
 
 1020          Stack.push_back(MO.getReg());
 
 1026           "Register stack pushes and pops should be balanced");
 
unsigned const MachineRegisterInfo * MRI
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
static Register UseReg(const MachineOperand &MO)
 
const HexagonInstrInfo * TII
 
Promote Memory to Register
 
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
 
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
 
static bool isSafeToMove(const MachineInstr &From, const MachineInstr &To)
Check if it's safe to move From down to To, checking that no physical registers are clobbered.
 
This file contains the declaration of the WebAssembly-specific manager for DebugValues associated wit...
 
This file provides WebAssembly-specific target descriptions.
 
This file declares WebAssembly-specific per-machine-function information.
 
static bool isSafeToMove(const MachineOperand *Def, const MachineOperand *Use, const MachineInstr *Insert, const WebAssemblyFunctionInfo &MFI, const MachineRegisterInfo &MRI, bool Optimize)
 
static unsigned getTeeOpcode(const TargetRegisterClass *RC)
Get the appropriate tee opcode for the given register class.
 
static MachineInstr * rematerializeCheapDef(unsigned Reg, MachineOperand &Op, MachineInstr &Def, MachineBasicBlock::instr_iterator Insert, LiveIntervals &LIS, WebAssemblyFunctionInfo &MFI, MachineRegisterInfo &MRI, const WebAssemblyInstrInfo *TII)
A trivially cloneable instruction; clone it and nest the new copy with the current instruction.
 
static void imposeStackOrdering(MachineInstr *MI)
 
static MachineInstr * moveForSingleUse(unsigned Reg, MachineOperand &Op, MachineInstr *Def, MachineBasicBlock &MBB, MachineInstr *Insert, LiveIntervals *LIS, WebAssemblyFunctionInfo &MFI, MachineRegisterInfo &MRI)
A single-use def in the same block with no intervening memory or register dependencies; move the def ...
 
static void query(const MachineInstr &MI, bool &Read, bool &Write, bool &Effects, bool &StackPointer)
 
static void shrinkToUses(LiveInterval &LI, LiveIntervals &LIS)
 
static void convertImplicitDefToConstZero(MachineInstr *MI, MachineRegisterInfo &MRI, const TargetInstrInfo *TII, MachineFunction &MF)
 
static bool hasSingleUse(unsigned Reg, MachineRegisterInfo &MRI, WebAssemblyFunctionInfo &MFI, bool Optimize, MachineInstr *Def, LiveIntervals *LIS)
 
static MachineInstr * getPrevNonDebugInst(MachineInstr *MI)
 
static bool shouldRematerialize(const MachineInstr &Def, const WebAssemblyInstrInfo *TII)
 
static MachineInstr * moveAndTeeForMultiUse(unsigned Reg, MachineOperand &Op, MachineInstr *Def, MachineBasicBlock &MBB, MachineInstr *Insert, LiveIntervals &LIS, WebAssemblyFunctionInfo &MFI, MachineRegisterInfo &MRI, const WebAssemblyInstrInfo *TII)
A multiple-use def in the same block with no intervening memory or register dependencies; move the de...
 
static bool oneUseDominatesOtherUses(unsigned Reg, const MachineOperand &OneUse, const MachineBasicBlock &MBB, const MachineRegisterInfo &MRI, const MachineDominatorTree &MDT, LiveIntervals &LIS, WebAssemblyFunctionInfo &MFI)
Test whether OneUse, a use of Reg, dominates all of Reg's other uses.
 
static void queryCallee(const MachineInstr &MI, bool &Read, bool &Write, bool &Effects, bool &StackPointer)
 
This file declares the WebAssembly-specific subclass of TargetSubtarget.
 
This file contains the declaration of the WebAssembly-specific utility functions.
 
This file contains the entry points for global functions defined in the LLVM WebAssembly back-end.
 
Represent the analysis usage information of a pass.
 
AnalysisUsage & addPreservedID(const void *ID)
 
AnalysisUsage & addRequired()
 
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
 
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
 
This is an important base class in LLVM.
 
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
 
FunctionPass class - This class is used to implement most global optimizations.
 
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
 
LiveInterval - This class represents the liveness of a register, or stack slot.
 
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
 
SlotIndex InsertMachineInstrInMaps(MachineInstr &MI)
 
LLVM_ABI void handleMove(MachineInstr &MI, bool UpdateFlags=false)
Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.
 
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
 
void RemoveMachineInstrFromMaps(MachineInstr &MI)
 
LiveInterval & getInterval(Register Reg)
 
void removeInterval(Register Reg)
Interval removal.
 
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
 
LLVM_ABI void removePhysRegDefAt(MCRegister Reg, SlotIndex Pos)
Remove value numbers and related live segments starting at position Pos that are part of any liverang...
 
LLVM_ABI void splitSeparateComponents(LiveInterval &LI, SmallVectorImpl< LiveInterval * > &SplitLIs)
Split separate components in LiveInterval LI into separate intervals.
 
LiveInterval & createAndComputeVirtRegInterval(Register Reg)
 
Segments::iterator iterator
 
bool liveAt(SlotIndex index) const
 
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
 
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
 
iterator FindSegmentContaining(SlotIndex Idx)
Return an iterator to the segment that contains the specified index, or end() if there is none.
 
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
 
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
 
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
 
static MCRegister from(unsigned Val)
Check the provided unsigned value is a valid MCRegister.
 
MachineInstrBundleIterator< const MachineInstr > const_iterator
 
Instructions::iterator instr_iterator
 
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
 
reverse_iterator rbegin()
 
MachineInstrBundleIterator< MachineInstr > iterator
 
Analysis pass which computes a MachineDominatorTree.
 
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
 
bool dominates(const MachineInstr *A, const MachineInstr *B) const
 
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
 
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
 
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
 
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
 
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
 
Function & getFunction()
Return the LLVM function that this machine code represents.
 
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
 
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
 
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
 
Representation of each machine instruction.
 
mop_range defs()
Returns all explicit operands that are register definitions.
 
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
 
const MachineBasicBlock * getParent() const
 
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
 
MachineOperand * mop_iterator
iterator/begin/end - Iterate over all operands of a machine instruction.
 
LLVM_ABI void dump() const
 
const MachineOperand & getOperand(unsigned i) const
 
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
 
MachineOperand class - Representation of each machine instruction operand.
 
const GlobalValue * getGlobal() const
 
static MachineOperand CreateFPImm(const ConstantFP *CFP)
 
bool isReg() const
isReg - Tests if this is a MO_Register operand.
 
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
 
static MachineOperand CreateImm(int64_t Val)
 
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
 
Register getReg() const
getReg - Returns the register number.
 
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
 
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
 
Wrapper class representing virtual and physical registers.
 
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
 
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
 
SlotIndex - An opaque wrapper around machine indexes.
 
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
 
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
 
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.
 
TargetInstrInfo - Interface to description of machine instruction set.
 
static const unsigned CommuteAnyOperandIndex
 
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
 
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
 
A Use represents the edge between a Value definition and its users.
 
VNInfo - Value Number Information.
 
SlotIndex def
The index of the defining instruction.
 
void updateReg(Register Reg)
 
void cloneSink(MachineInstr *Insert, Register NewReg=Register(), bool CloneDef=true) const
 
void sink(MachineInstr *Insert)
 
This class is derived from MachineFunctionInfo and contains private WebAssembly-specific information ...
 
void stackifyVReg(MachineRegisterInfo &MRI, Register VReg)
 
unsigned getFrameBaseVreg() const
 
bool isVRegStackified(Register VReg) const
 
void clearFrameBaseVreg()
 
bool isFrameBaseVirtual() const
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
 
@ Define
Register definition.
 
bool isArgument(unsigned Opc)
 
const MachineOperand & getCalleeOp(const MachineInstr &MI)
Returns the operand number of a callee, assuming the argument is a call instruction.
 
bool isCatch(unsigned Opc)
 
NodeAddr< DefNode * > Def
 
NodeAddr< InstrNode * > Instr
 
NodeAddr< UseNode * > Use
 
This is an optimization pass for GlobalISel generic memory operations.
 
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
 
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
 
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
FunctionPass * createWebAssemblyRegStackify(CodeGenOptLevel OptLevel)
 
auto reverse(ContainerTy &&C)
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
CodeGenOptLevel
Code generation optimization level.
 
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
 
unsigned getUndefRegState(bool B)
 
DWARFExpression::Operation Op
 
LLVM_ABI char & LiveVariablesID
LiveVariables pass - This pass computes the set of blocks in which each variable is life and sets mac...
 
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
 
MachineInstr * getVRegDef(MachineRegisterInfo &MRI, Register Reg)