LLVM  10.0.0svn
Macros | Functions
WebAssemblyRegStackify.cpp File Reference

This file implements a register stacking pass. More...

#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
#include "WebAssembly.h"
#include "WebAssemblyDebugValueManager.h"
#include "WebAssemblyMachineFunctionInfo.h"
#include "WebAssemblySubtarget.h"
#include "WebAssemblyUtilities.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/CodeGen/LiveIntervals.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
Include dependency graph for WebAssemblyRegStackify.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "wasm-reg-stackify"
 

Functions

 INITIALIZE_PASS (WebAssemblyRegStackify, DEBUG_TYPE, "Reorder instructions to use the WebAssembly value stack", false, false) FunctionPass *llvm
 
static void imposeStackOrdering (MachineInstr *MI)
 
static void convertImplicitDefToConstZero (MachineInstr *MI, MachineRegisterInfo &MRI, const TargetInstrInfo *TII, MachineFunction &MF, LiveIntervals &LIS)
 
static void queryCallee (const MachineInstr &MI, unsigned CalleeOpNo, bool &Read, bool &Write, bool &Effects, bool &StackPointer)
 
static void query (const MachineInstr &MI, AliasAnalysis &AA, bool &Read, bool &Write, bool &Effects, bool &StackPointer)
 
static bool shouldRematerialize (const MachineInstr &Def, AliasAnalysis &AA, const WebAssemblyInstrInfo *TII)
 
static MachineInstrgetVRegDef (unsigned Reg, const MachineInstr *Insert, const MachineRegisterInfo &MRI, const LiveIntervals &LIS)
 
static bool hasOneUse (unsigned Reg, MachineInstr *Def, MachineRegisterInfo &MRI, MachineDominatorTree &MDT, LiveIntervals &LIS)
 
static bool isSafeToMove (const MachineInstr *Def, const MachineInstr *Insert, AliasAnalysis &AA, const MachineRegisterInfo &MRI)
 
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. More...
 
static unsigned getTeeOpcode (const TargetRegisterClass *RC)
 Get the appropriate tee opcode for the given register class. More...
 
static void shrinkToUses (LiveInterval &LI, LiveIntervals &LIS)
 
static MachineInstrmoveForSingleUse (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 down and nest it with the current instruction. More...
 
static MachineInstrrematerializeCheapDef (unsigned Reg, MachineOperand &Op, MachineInstr &Def, MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator Insert, LiveIntervals &LIS, WebAssemblyFunctionInfo &MFI, MachineRegisterInfo &MRI, const WebAssemblyInstrInfo *TII, const WebAssemblyRegisterInfo *TRI)
 A trivially cloneable instruction; clone it and nest the new copy with the current instruction. More...
 
static MachineInstrmoveAndTeeForMultiUse (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 def down, nest it with the current instruction, and insert a tee to satisfy the rest of the uses. More...
 

Detailed Description

This file implements a register stacking pass.

This pass reorders instructions to put register uses and defs in an order such that they form single-use expression trees. Registers fitting this form are then marked as "stackified", meaning references to them are replaced by "push" and "pop" from the value stack.

This is primarily a code size optimization, since temporary values on the value stack don't need to be named.

Definition in file WebAssemblyRegStackify.cpp.

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "wasm-reg-stackify"

Definition at line 41 of file WebAssemblyRegStackify.cpp.

Function Documentation

◆ convertImplicitDefToConstZero()

static void convertImplicitDefToConstZero ( MachineInstr MI,
MachineRegisterInfo MRI,
const TargetInstrInfo TII,
MachineFunction MF,
LiveIntervals LIS 
)
static

◆ getTeeOpcode()

static unsigned getTeeOpcode ( const TargetRegisterClass RC)
static

Get the appropriate tee opcode for the given register class.

Definition at line 459 of file WebAssemblyRegStackify.cpp.

References llvm_unreachable.

Referenced by moveAndTeeForMultiUse().

◆ getVRegDef()

static MachineInstr* getVRegDef ( unsigned  Reg,
const MachineInstr Insert,
const MachineRegisterInfo MRI,
const LiveIntervals LIS 
)
static

◆ hasOneUse()

static bool hasOneUse ( unsigned  Reg,
MachineInstr Def,
MachineRegisterInfo MRI,
MachineDominatorTree MDT,
LiveIntervals LIS 
)
static

◆ imposeStackOrdering()

static void imposeStackOrdering ( MachineInstr MI)
static

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( WebAssemblyRegStackify  ,
DEBUG_TYPE  ,
"Reorder instructions to use the WebAssembly value stack"  ,
false  ,
false   
)

Definition at line 71 of file WebAssemblyRegStackify.cpp.

◆ isSafeToMove()

static bool isSafeToMove ( const MachineInstr Def,
const MachineInstr Insert,
AliasAnalysis AA,
const MachineRegisterInfo MRI 
)
static

◆ moveAndTeeForMultiUse()

static MachineInstr* moveAndTeeForMultiUse ( unsigned  Reg,
MachineOperand Op,
MachineInstr Def,
MachineBasicBlock MBB,
MachineInstr Insert,
LiveIntervals LIS,
WebAssemblyFunctionInfo MFI,
MachineRegisterInfo MRI,
const WebAssemblyInstrInfo TII 
)
static

A multiple-use def in the same block with no intervening memory or register dependencies; move the def down, nest it with the current instruction, and insert a tee to satisfy the rest of the uses.

As an illustration, rewrite this:

Reg = INST ... // Def INST ..., Reg, ... // Insert INST ..., Reg, ... INST ..., Reg, ...

to this:

DefReg = INST ... // Def (to become the new Insert) TeeReg, Reg = TEE_... DefReg INST ..., TeeReg, ... // Insert INST ..., Reg, ... INST ..., Reg, ...

with DefReg and TeeReg stackified. This eliminates a local.get from the resulting code.

Definition at line 596 of file WebAssemblyRegStackify.cpp.

References llvm::MachineInstrBuilder::addReg(), assert(), llvm::SmallVectorTemplateCommon< T >::back(), llvm::iterator_range< IteratorT >::begin(), llvm::BuildMI(), llvm::TargetInstrInfo::CommuteAnyOperandIndex, convertImplicitDefToConstZero(), llvm::LiveIntervals::createAndComputeVirtRegInterval(), llvm::MachineRegisterInfo::createVirtualRegister(), llvm::dbgs(), llvm::tgtok::Def, llvm::VNInfo::def, llvm::RegState::Define, llvm::drop_begin(), llvm::MachineInstr::dump(), llvm::SmallVectorBase::empty(), llvm::iterator_range< IteratorT >::end(), llvm::MachineInstr::explicit_uses(), llvm::LiveRange::FindSegmentContaining(), llvm::MachineInstr::getDebugLoc(), llvm::MachineFunction::getInfo(), llvm::LiveIntervals::getInstructionIndex(), llvm::LiveIntervals::getInterval(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineFunction::getName(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClass(), llvm::MachineFunction::getRegInfo(), llvm::SlotIndex::getRegSlot(), llvm::MachineInstrBundleIterator< Ty, IsReverse >::getReverse(), llvm::MachineFunction::getSubtarget(), getTeeOpcode(), llvm::getUndefRegState(), llvm::LiveRange::getVNInfoAt(), getVRegDef(), llvm::LiveIntervals::handleMove(), hasOneUse(), I, imposeStackOrdering(), llvm::LiveIntervals::InsertMachineInstrInMaps(), llvm::WebAssembly::isArgument(), llvm::MachineOperand::isDead(), llvm::MachineInstr::isDebugValue(), llvm::MachineOperand::isImplicit(), llvm::MachineInstr::isInlineAsm(), llvm::Register::isPhysicalRegister(), llvm::MachineOperand::isReg(), isSafeToMove(), llvm::MachineOperand::isUse(), llvm::WebAssemblyFunctionInfo::isVRegStackified(), LLVM_DEBUG, MI, moveForSingleUse(), MRI, oneUseDominatesOtherUses(), llvm::SmallVectorTemplateBase< T >::pop_back(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, rematerializeCheapDef(), llvm::reverse(), llvm::MachineOperand::setReg(), shouldRematerialize(), shrinkToUses(), llvm::MachineBasicBlock::splice(), llvm::WebAssemblyFunctionInfo::stackifyVReg(), TII, and TRI.

◆ moveForSingleUse()

static MachineInstr* moveForSingleUse ( unsigned  Reg,
MachineOperand Op,
MachineInstr Def,
MachineBasicBlock MBB,
MachineInstr Insert,
LiveIntervals LIS,
WebAssemblyFunctionInfo MFI,
MachineRegisterInfo MRI 
)
static

◆ oneUseDominatesOtherUses()

static bool oneUseDominatesOtherUses ( unsigned  Reg,
const MachineOperand OneUse,
const MachineBasicBlock MBB,
const MachineRegisterInfo MRI,
const MachineDominatorTree MDT,
LiveIntervals LIS,
WebAssemblyFunctionInfo MFI 
)
static

◆ query()

static void query ( const MachineInstr MI,
AliasAnalysis AA,
bool Read,
bool Write,
bool Effects,
bool StackPointer 
)
static

◆ queryCallee()

static void queryCallee ( const MachineInstr MI,
unsigned  CalleeOpNo,
bool Read,
bool Write,
bool Effects,
bool StackPointer 
)
static

◆ rematerializeCheapDef()

static MachineInstr* rematerializeCheapDef ( unsigned  Reg,
MachineOperand Op,
MachineInstr Def,
MachineBasicBlock MBB,
MachineBasicBlock::instr_iterator  Insert,
LiveIntervals LIS,
WebAssemblyFunctionInfo MFI,
MachineRegisterInfo MRI,
const WebAssemblyInstrInfo TII,
const WebAssemblyRegisterInfo TRI 
)
static

◆ shouldRematerialize()

static bool shouldRematerialize ( const MachineInstr Def,
AliasAnalysis AA,
const WebAssemblyInstrInfo TII 
)
static

Definition at line 261 of file WebAssemblyRegStackify.cpp.

References llvm::MachineInstr::isAsCheapAsAMove().

Referenced by moveAndTeeForMultiUse().

◆ shrinkToUses()

static void shrinkToUses ( LiveInterval LI,
LiveIntervals LIS 
)
static