LLVM  6.0.0svn
Macros | Functions | Variables
MachinePipeliner.cpp File Reference
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/PriorityQueue.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/DFAPacketizer.h"
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RegisterClassInfo.h"
#include "llvm/CodeGen/RegisterPressure.h"
#include "llvm/CodeGen/ScheduleDAG.h"
#include "llvm/CodeGen/ScheduleDAGInstrs.h"
#include "llvm/CodeGen/ScheduleDAGMutation.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/Function.h"
#include "llvm/MC/LaneBitmask.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <climits>
#include <cstdint>
#include <deque>
#include <functional>
#include <iterator>
#include <map>
#include <memory>
#include <tuple>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "pipeliner"
 

Functions

 STATISTIC (NumTrytoPipeline, "Number of loops that we attempt to pipeline")
 
 STATISTIC (NumPipelined, "Number of loops software pipelined")
 
 INITIALIZE_PASS_BEGIN (MachinePipeliner, DEBUG_TYPE, "Modulo Software Pipelining", false, false) INITIALIZE_PASS_END(MachinePipeliner
 
static void getPhiRegs (MachineInstr &Phi, MachineBasicBlock *Loop, unsigned &InitVal, unsigned &LoopVal)
 Return the register values for the operands of a Phi instruction. More...
 
static unsigned getInitPhiReg (MachineInstr &Phi, MachineBasicBlock *LoopBB)
 Return the Phi register value that comes from the incoming block. More...
 
static unsigned getLoopPhiReg (MachineInstr &Phi, MachineBasicBlock *LoopBB)
 Return the Phi register value that comes the the loop block. More...
 
static bool isSuccOrder (SUnit *SUa, SUnit *SUb)
 Return true if SUb can be reached from SUa following the chain edges. More...
 
static bool isDependenceBarrier (MachineInstr &MI, AliasAnalysis *AA)
 Return true if the instruction causes a chain between memory references before and after it. More...
 
static void getUnderlyingObjects (MachineInstr *MI, SmallVectorImpl< Value *> &Objs, const DataLayout &DL)
 Return the underlying objects for the memory references of an instruction. More...
 
static void swapAntiDependences (std::vector< SUnit > &SUnits)
 Swap all the anti dependences in the DAG. More...
 
static bool ignoreDependence (const SDep &D, bool isPred)
 Return true for DAG nodes that we ignore when computing the cost functions. More...
 
static bool pred_L (SetVector< SUnit *> &NodeOrder, SmallSetVector< SUnit *, 8 > &Preds, const NodeSet *S=nullptr)
 Compute the Pred_L(O) set, as defined in the paper. More...
 
static bool succ_L (SetVector< SUnit *> &NodeOrder, SmallSetVector< SUnit *, 8 > &Succs, const NodeSet *S=nullptr)
 Compute the Succ_L(O) set, as defined in the paper. More...
 
static bool computePath (SUnit *Cur, SetVector< SUnit *> &Path, SetVector< SUnit *> &DestNodes, SetVector< SUnit *> &Exclude, SmallPtrSet< SUnit *, 8 > &Visited)
 Return true if there is a path from the specified node to any of the nodes in DestNodes. More...
 
template<class S1Ty , class S2Ty >
static bool isSubset (S1Ty &Set1, S2Ty &Set2)
 Return true if Set1 is a subset of Set2. More...
 
static void computeLiveOuts (MachineFunction &MF, RegPressureTracker &RPTracker, NodeSet &NS)
 Compute the live-out registers for the instructions in a node-set. More...
 
static bool isIntersect (SmallSetVector< SUnit *, 8 > &Set1, const NodeSet &Set2, SmallSetVector< SUnit *, 8 > &Result)
 Return true if Set1 contains elements in Set2. More...
 
static bool hasDataDependence (SUnit *Inst1, SUnit *Inst2)
 Return true if Inst1 defines a value that is used in Inst2. More...
 
static void replaceRegUsesAfterLoop (unsigned FromReg, unsigned ToReg, MachineBasicBlock *MBB, MachineRegisterInfo &MRI, LiveIntervals &LIS)
 Replace all uses of FromReg that appear outside the specified basic block with ToReg. More...
 
static bool hasUseAfterLoop (unsigned Reg, MachineBasicBlock *BB, MachineRegisterInfo &MRI)
 Return true if the register has a use that occurs outside the specified loop. More...
 
static void removePhis (MachineBasicBlock *BB, MachineBasicBlock *Incoming)
 Remove the incoming block from the Phis in a basic block. More...
 
static SUnitmultipleIterations (SUnit *SU, SwingSchedulerDAG *DAG)
 If an instruction has a use that spans multiple iterations, then return true. More...
 

Variables

static cl::opt< boolEnableSWP ("enable-pipeliner", cl::Hidden, cl::init(true), cl::ZeroOrMore, cl::desc("Enable Software Pipelining"))
 A command line option to turn software pipelining on or off. More...
 
static cl::opt< boolEnableSWPOptSize ("enable-pipeliner-opt-size", cl::desc("Enable SWP at Os."), cl::Hidden, cl::init(false))
 A command line option to enable SWP at -Os. More...
 
static cl::opt< int > SwpMaxMii ("pipeliner-max-mii", cl::desc("Size limit for the the MII."), cl::Hidden, cl::init(27))
 A command line argument to limit minimum initial interval for pipelining. More...
 
static cl::opt< int > SwpMaxStages ("pipeliner-max-stages", cl::desc("Maximum stages allowed in the generated scheduled."), cl::Hidden, cl::init(3))
 A command line argument to limit the number of stages in the pipeline. More...
 
static cl::opt< boolSwpPruneDeps ("pipeliner-prune-deps", cl::desc("Prune dependences between unrelated Phi nodes."), cl::Hidden, cl::init(true))
 A command line option to disable the pruning of chain dependences due to an unrelated Phi. More...
 
static cl::opt< boolSwpPruneLoopCarried ("pipeliner-prune-loop-carried", cl::desc("Prune loop carried order dependences."), cl::Hidden, cl::init(true))
 A command line option to disable the pruning of loop carried order dependences. More...
 
static cl::opt< int > SwpLoopLimit ("pipeliner-max", cl::Hidden, cl::init(-1))
 
static cl::opt< boolSwpIgnoreRecMII ("pipeliner-ignore-recmii", cl::ReallyHidden, cl::init(false), cl::ZeroOrMore, cl::desc("Ignore RecMII"))
 
 DEBUG_TYPE
 
Modulo Software Pipelining
 
Modulo Software false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "pipeliner"

Definition at line 124 of file MachinePipeliner.cpp.

Function Documentation

◆ computeLiveOuts()

static void computeLiveOuts ( MachineFunction MF,
RegPressureTracker RPTracker,
NodeSet &  NS 
)
static

Compute the live-out registers for the instructions in a node-set.

The live-out registers are those that are defined in the node-set, but not used. Except for use operands of Phis.

Definition at line 1729 of file MachinePipeliner.cpp.

References llvm::RegPressureTracker::addLiveRegs(), B, llvm::SetVector< T, Vector, Set >::begin(), llvm::SmallPtrSetImplBase::clear(), llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::clear(), llvm::RegPressureTracker::closeBottom(), computePath(), llvm::SmallSet< T, N, C >::count(), llvm::SetVector< T, Vector, Set >::count(), llvm::dbgs(), DEBUG, llvm::SetVector< T, Vector, Set >::empty(), llvm::SetVector< T, Vector, Set >::end(), llvm::RegPressureDelta::Excess, llvm::SUnit::getDepth(), llvm::SUnit::getInstr(), llvm::RegPressureTracker::getMaxUpwardPressureDelta(), llvm::LaneBitmask::getNone(), llvm::PressureChange::getPSet(), llvm::MachineFunction::getRegInfo(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), llvm::PressureChange::getUnitInc(), I, llvm::RegPressureTracker::init(), llvm::SmallSet< T, N, C >::insert(), llvm::SetVector< T, Vector, Set >::insert(), llvm::MachineRegisterInfo::isAllocatable(), llvm::MachineInstr::isPHI(), isSubset(), llvm::PressureChange::isValid(), llvm::MCRegisterInfo::DiffListIterator::isValid(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::RegisterPressure::MaxSetPressure, MI, N, llvm::SUnit::NodeNum, llvm::MachineInstr::operands(), pred_L(), llvm::SUnit::Preds, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::RegPressureTracker::recede(), llvm::RegPressureTracker::setPos(), SI, llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::size(), llvm::parallel::sort(), succ_L(), llvm::Successor, and llvm::SUnit::Succs.

◆ computePath()

static bool computePath ( SUnit Cur,
SetVector< SUnit *> &  Path,
SetVector< SUnit *> &  DestNodes,
SetVector< SUnit *> &  Exclude,
SmallPtrSet< SUnit *, 8 > &  Visited 
)
static

Return true if there is a path from the specified node to any of the nodes in DestNodes.

Keep track and return the nodes in any path.

Definition at line 1694 of file MachinePipeliner.cpp.

References llvm::SDep::Anti, llvm::SetVector< T, Vector, Set >::count(), llvm::SetVector< T, Vector, Set >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SUnit::isBoundaryNode(), llvm::SUnit::Preds, SI, and llvm::SUnit::Succs.

Referenced by computeLiveOuts().

◆ getInitPhiReg()

static unsigned getInitPhiReg ( MachineInstr Phi,
MachineBasicBlock LoopBB 
)
static

Return the Phi register value that comes from the incoming block.

Definition at line 968 of file MachinePipeliner.cpp.

References llvm::MachineOperand::getMBB(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOperand(), and llvm::MachineOperand::getReg().

Referenced by hasUseAfterLoop(), and removePhis().

◆ getLoopPhiReg()

static unsigned getLoopPhiReg ( MachineInstr Phi,
MachineBasicBlock LoopBB 
)
static

◆ getPhiRegs()

static void getPhiRegs ( MachineInstr Phi,
MachineBasicBlock Loop,
unsigned InitVal,
unsigned LoopVal 
)
static

Return the register values for the operands of a Phi instruction.

This function assume the instruction is a Phi.

Definition at line 952 of file MachinePipeliner.cpp.

References assert(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), and llvm::MachineInstr::isPHI().

Referenced by hasUseAfterLoop(), multipleIterations(), and removePhis().

◆ getUnderlyingObjects()

static void getUnderlyingObjects ( MachineInstr MI,
SmallVectorImpl< Value *> &  Objs,
const DataLayout DL 
)
static

Return the underlying objects for the memory references of an instruction.

This function calls the code in ValueTracking, but first checks that the instruction has a memory operand.

Definition at line 1016 of file MachinePipeliner.cpp.

References llvm::SUnit::addPred(), llvm::TargetSubtargetInfo::adjustSchedDependency(), llvm::AAResults::alias(), llvm::SDep::Anti, llvm::TargetInstrInfo::areMemAccessesTriviallyDisjoint(), assert(), llvm::SDep::Barrier, llvm::SmallVectorTemplateCommon< T >::begin(), llvm::InstrItineraryData::beginStage(), C, llvm::DFAPacketizer::canReserveResources(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::clear(), llvm::SmallVectorImpl< T >::clear(), llvm::countPopulation(), llvm::TargetInstrInfo::CreateTargetScheduleState(), D, llvm::SDep::Data, DefMI, E, llvm::MapVector< KeyT, ValueT, MapType, VectorType >::end(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::InstrItineraryData::endStage(), F(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::find(), llvm::MachineMemOperand::getAAInfo(), llvm::MachineFunction::getDataLayout(), llvm::MachineInstr::getDesc(), llvm::MachineBasicBlock::getFirstNonPHI(), llvm::MachineBasicBlock::getFirstTerminator(), llvm::LoopBase< BlockT, LoopT >::getHeader(), llvm::SUnit::getInstr(), llvm::TargetSubtargetInfo::getInstrItineraryData(), getLoopPhiReg(), llvm::TargetInstrInfo::getMemOpBaseRegImmOfs(), llvm::MachineMemOperand::getOffset(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::MCInstrDesc::getSchedClass(), llvm::MachineFunction::getSubtarget(), llvm::GetUnderlyingObjects(), llvm::MachineRegisterInfo::getUniqueVRegDef(), llvm::MachineMemOperand::getValue(), llvm::MachineInstr::hasOneMemOperand(), I, llvm::ARM_PROC::IE, isDependenceBarrier(), llvm::MachineInstr::isPHI(), llvm::ScheduleDAGTopologicalSort::IsReachable(), isSuccOrder(), llvm::TargetInstrInfo::isZeroCost(), llvm::SPII::Load, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup(), llvm::MachineInstr::mayLoad(), llvm::MachineInstr::mayStore(), llvm::MachineInstr::memoperands_begin(), MI, llvm::NoAlias, llvm::SUnit::NodeNum, llvm::MachineInstr::operands_begin(), llvm::MachineInstr::operands_end(), llvm::SDep::Order, P, llvm::SUnit::Preds, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SUnit::removePred(), llvm::ScheduleDAGTopologicalSort::RemovePred(), llvm::DFAPacketizer::reserveResources(), llvm::SDep::setLatency(), llvm::SmallVectorTemplateCommon< T >::size(), SwpPruneDeps, llvm::MemoryLocation::UnknownSize, llvm::MachineRegisterInfo::use_instr_begin(), llvm::MachineRegisterInfo::use_instr_end(), and UseMI.

Referenced by addLiveInRegs().

◆ hasDataDependence()

static bool hasDataDependence ( SUnit Inst1,
SUnit Inst2 
)
static

Return true if Inst1 defines a value that is used in Inst2.

Definition at line 1992 of file MachinePipeliner.cpp.

References llvm::MachineBasicBlock::addSuccessor(), llvm::TargetInstrInfo::analyzeBranch(), llvm::SDep::Anti, assert(), llvm::SmallVectorTemplateCommon< T >::back(), llvm::MachineBasicBlock::back(), llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::begin(), llvm::SetVector< T, Vector, Set >::begin(), llvm::SetVector< T, Vector, Set >::clear(), llvm::MachineFunction::CloneMachineInstr(), llvm::SetVector< T, Vector, Set >::count(), llvm::MachineFunction::CreateMachineBasicBlock(), llvm::SDep::Data, llvm::dbgs(), DEBUG, llvm::MachineBasicBlock::dump(), llvm::MachineInstr::dump(), E, llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::empty(), llvm::SetVector< T, Vector, Set >::empty(), llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::end(), llvm::SetVector< T, Vector, Set >::end(), llvm::SUnit::getInstr(), llvm::MachineLoopInfo::getLoopFor(), llvm::LoopBase< BlockT, LoopT >::getLoopPreheader(), llvm::MachineOperand::getMBB(), I, ignoreDependence(), llvm::tgtok::In, llvm::SetVector< T, Vector, Set >::insert(), llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::insert(), llvm::MachineFunction::insert(), llvm::TargetInstrInfo::insertBranch(), isIntersect(), llvm::MachineInstr::isPHI(), isSubset(), llvm::max(), MI, N, llvm::AArch64CC::NE, llvm::SUnit::NodeNum, pred_L(), llvm::SUnit::Preds, llvm::MachineBasicBlock::push_back(), llvm::TargetInstrInfo::removeBranch(), llvm::MachineBasicBlock::replaceSuccessor(), llvm::MachineOperand::setMBB(), SI, llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::size(), llvm::MachineBasicBlock::succ_begin(), llvm::MachineBasicBlock::succ_end(), succ_L(), llvm::SUnit::Succs, SwpMaxStages, and llvm::MachineBasicBlock::transferSuccessors().

◆ hasUseAfterLoop()

static bool hasUseAfterLoop ( unsigned  Reg,
MachineBasicBlock BB,
MachineRegisterInfo MRI 
)
static

◆ ignoreDependence()

static bool ignoreDependence ( const SDep D,
bool  isPred 
)
static

Return true for DAG nodes that we ignore when computing the cost functions.

We ignore the back-edge recurrence in order to avoid unbounded recurison in the calculation of the ASAP, ALAP, etc functions.

Definition at line 1548 of file MachinePipeliner.cpp.

References llvm::SDep::Anti, llvm::ScheduleDAGTopologicalSort::begin(), llvm::dbgs(), DEBUG, llvm::SUnit::dump(), E, llvm::ScheduleDAGTopologicalSort::end(), llvm::SDep::getKind(), getLatency(), I, llvm::SDep::isArtificial(), llvm::max(), pred, llvm::SUnit::Preds, llvm::ScheduleDAGTopologicalSort::rbegin(), llvm::ScheduleDAGTopologicalSort::rend(), and llvm::SUnit::Succs.

Referenced by hasDataDependence(), pred_L(), and succ_L().

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( MachinePipeliner  ,
DEBUG_TYPE  ,
"Modulo Software Pipelining ,
false  ,
false   
)

◆ isDependenceBarrier()

static bool isDependenceBarrier ( MachineInstr MI,
AliasAnalysis AA 
)
static

Return true if the instruction causes a chain between memory references before and after it.

Definition at line 1007 of file MachinePipeliner.cpp.

References llvm::MachineInstr::hasOrderedMemoryRef(), llvm::MachineInstr::hasUnmodeledSideEffects(), llvm::MachineInstr::isCall(), llvm::MachineInstr::isDereferenceableInvariantLoad(), and llvm::MachineInstr::mayLoad().

Referenced by getUnderlyingObjects().

◆ isIntersect()

static bool isIntersect ( SmallSetVector< SUnit *, 8 > &  Set1,
const NodeSet &  Set2,
SmallSetVector< SUnit *, 8 > &  Result 
)
static

◆ isSubset()

template<class S1Ty , class S2Ty >
static bool isSubset ( S1Ty &  Set1,
S2Ty &  Set2 
)
static

Return true if Set1 is a subset of Set2.

Definition at line 1719 of file MachinePipeliner.cpp.

References E, and I.

Referenced by computeLiveOuts(), and hasDataDependence().

◆ isSuccOrder()

static bool isSuccOrder ( SUnit SUa,
SUnit SUb 
)
static

◆ multipleIterations()

static SUnit* multipleIterations ( SUnit SU,
SwingSchedulerDAG *  DAG 
)
static

If an instruction has a use that spans multiple iterations, then return true.

These instructions are characterized by having a back-ege to a Phi, which contains a reference to another Phi.

Definition at line 3589 of file MachinePipeliner.cpp.

References assert(), llvm::MachineFunction::CloneMachineInstr(), llvm::dbgs(), DEBUG, llvm::tgtok::Def, dump(), llvm::dump(), E, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::WebAssembly::End, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::TargetInstrInfo::getBaseAndOffsetPosition(), llvm::MachineOperand::getImm(), llvm::SUnit::getInstr(), llvm::TargetSubtargetInfo::getInstrInfo(), getLoopPhiReg(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getParent(), getPhiRegs(), llvm::MachineOperand::getReg(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::SDep::getSUnit(), llvm::MachineRegisterInfo::getVRegDef(), llvm::SUnit::hasPhysRegDefs, I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::MachineOperand::isDef(), llvm::MachineInstr::isPHI(), llvm::TargetRegisterInfo::isPhysicalRegister(), llvm::SUnit::isPred(), llvm::MachineOperand::isReg(), llvm::MachineInstr::isRegTiedToUseOperand(), llvm::MachineOperand::isUse(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::TargetInstrInfo::isZeroCost(), LLVM_DUMP_METHOD, llvm::max(), llvm::SUnit::NodeNum, llvm::SDep::Order, llvm::SUnit::Preds, print(), llvm::MachineInstr::print(), llvm::MachineOperand::setImm(), llvm::SUnit::setInstr(), llvm::MachineOperand::setReg(), SI, llvm::SUnit::Succs, llvm::MachineRegisterInfo::use_begin(), llvm::MachineRegisterInfo::use_end(), and UseMI.

◆ pred_L()

static bool pred_L ( SetVector< SUnit *> &  NodeOrder,
SmallSetVector< SUnit *, 8 > &  Preds,
const NodeSet *  S = nullptr 
)
static

◆ removePhis()

static void removePhis ( MachineBasicBlock BB,
MachineBasicBlock Incoming 
)
static

Remove the incoming block from the Phis in a basic block.

Definition at line 2973 of file MachinePipeliner.cpp.

References llvm::MachineBasicBlock::addSuccessor(), llvm::MachineFunction::allocateMemRefsArray(), assert(), llvm::MachineBasicBlock::clear(), llvm::MachineFunction::CloneMachineInstr(), llvm::computeDelta(), llvm::MachineRegisterInfo::constrainRegClass(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::count(), llvm::MachineRegisterInfo::createVirtualRegister(), D, llvm::dbgs(), DEBUG, llvm::tgtok::Def, llvm::MachineInstr::dump(), E, llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::MachineBasicBlock::eraseFromParent(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::TargetInstrInfo::getBaseAndOffsetPosition(), llvm::MachineBasicBlock::getFirstNonPHI(), llvm::MachineOperand::getImm(), llvm::TargetInstrInfo::getIncrementValue(), getInitPhiReg(), llvm::SUnit::getInstr(), llvm::TargetSubtargetInfo::getInstrInfo(), getLoopPhiReg(), llvm::MachineFunction::getMachineMemOperand(), llvm::MachineOperand::getMBB(), llvm::TargetInstrInfo::getMemOpBaseRegImmOfs(), llvm::MachineInstr::getMF(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getParent(), getPhiRegs(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClass(), llvm::MachineFunction::getRegInfo(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), llvm::SDep::getSUnit(), llvm::MachineRegisterInfo::getVRegDef(), llvm::MachineInstr::hasOrderedMemoryRef(), llvm::MachineInstr::hasUnmodeledSideEffects(), I, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::TargetInstrInfo::insertBranch(), llvm::MachineBasicBlock::instr_begin(), llvm::MachineBasicBlock::instr_rbegin(), llvm::MachineBasicBlock::instr_rend(), llvm::SDep::isArtificial(), llvm::MachineOperand::isDef(), llvm::MachineInstr::isInlineAsm(), llvm::MachineInstr::isPHI(), llvm::TargetInstrInfo::isPostIncrement(), llvm::MachineOperand::isReg(), llvm::MachineInstr::isRegTiedToUseOperand(), llvm::MachineOperand::isUse(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::TargetInstrInfo::isZeroCost(), llvm::max(), llvm::MachineInstr::mayLoad(), llvm::MachineInstr::mayStore(), llvm::MachineInstr::memoperands(), llvm::MachineInstr::memoperands_begin(), llvm::MachineInstr::memoperands_end(), MI, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SUnit::Preds, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::TargetInstrInfo::reduceLoopCount(), llvm::MachineBasicBlock::removeSuccessor(), replaceRegUsesAfterLoop(), llvm::MachineOperand::setImm(), llvm::SUnit::setInstr(), llvm::MachineInstr::setMemRefs(), llvm::MachineOperand::setReg(), SI, llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::SUnit::Succs, std::swap(), SwpPruneLoopCarried, llvm::MachineInstr::tieOperands(), llvm::MachineRegisterInfo::use_begin(), llvm::MachineRegisterInfo::use_end(), and UseMI.

◆ replaceRegUsesAfterLoop()

static void replaceRegUsesAfterLoop ( unsigned  FromReg,
unsigned  ToReg,
MachineBasicBlock MBB,
MachineRegisterInfo MRI,
LiveIntervals LIS 
)
static

◆ STATISTIC() [1/2]

STATISTIC ( NumTrytoPipeline  ,
"Number of loops that we attempt to pipeline"   
)

◆ STATISTIC() [2/2]

STATISTIC ( NumPipelined  ,
"Number of loops software pipelined"   
)

◆ succ_L()

static bool succ_L ( SetVector< SUnit *> &  NodeOrder,
SmallSetVector< SUnit *, 8 > &  Succs,
const NodeSet *  S = nullptr 
)
static

◆ swapAntiDependences()

static void swapAntiDependences ( std::vector< SUnit > &  SUnits)
static

Variable Documentation

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 727 of file MachinePipeliner.cpp.

◆ EnableSWP

cl::opt<bool> EnableSWP("enable-pipeliner", cl::Hidden, cl::init(true), cl::ZeroOrMore, cl::desc("Enable Software Pipelining"))
static

A command line option to turn software pipelining on or off.

◆ EnableSWPOptSize

cl::opt<bool> EnableSWPOptSize("enable-pipeliner-opt-size", cl::desc("Enable SWP at Os."), cl::Hidden, cl::init(false))
static

A command line option to enable SWP at -Os.

◆ false

Modulo Software false

Definition at line 727 of file MachinePipeliner.cpp.

◆ Pipelining

Modulo Software Pipelining

Definition at line 727 of file MachinePipeliner.cpp.

◆ SwpIgnoreRecMII

cl::opt<bool> SwpIgnoreRecMII("pipeliner-ignore-recmii", cl::ReallyHidden, cl::init(false), cl::ZeroOrMore, cl::desc("Ignore RecMII"))
static

◆ SwpLoopLimit

cl::opt<int> SwpLoopLimit("pipeliner-max", cl::Hidden, cl::init(-1))
static

◆ SwpMaxMii

cl::opt<int> SwpMaxMii("pipeliner-max-mii", cl::desc("Size limit for the the MII."), cl::Hidden, cl::init(27))
static

A command line argument to limit minimum initial interval for pipelining.

◆ SwpMaxStages

cl::opt<int> SwpMaxStages("pipeliner-max-stages", cl::desc("Maximum stages allowed in the generated scheduled."), cl::Hidden, cl::init(3))
static

A command line argument to limit the number of stages in the pipeline.

Referenced by hasDataDependence().

◆ SwpPruneDeps

cl::opt<bool> SwpPruneDeps("pipeliner-prune-deps", cl::desc("Prune dependences between unrelated Phi nodes."), cl::Hidden, cl::init(true))
static

A command line option to disable the pruning of chain dependences due to an unrelated Phi.

Referenced by getUnderlyingObjects().

◆ SwpPruneLoopCarried

cl::opt<bool> SwpPruneLoopCarried("pipeliner-prune-loop-carried", cl::desc("Prune loop carried order dependences."), cl::Hidden, cl::init(true))
static

A command line option to disable the pruning of loop carried order dependences.

Referenced by removePhis().