|
LLVM 23.0.0git
|
#include "Hexagon.h"#include "HexagonGlobalRegion.h"#include "HexagonMachineFunctionInfo.h"#include "HexagonRegisterInfo.h"#include "HexagonSubtarget.h"#include "HexagonTargetMachine.h"#include "HexagonVLIWPacketizer.h"#include "llvm/ADT/DenseMap.h"#include "llvm/ADT/SmallSet.h"#include "llvm/ADT/Statistic.h"#include "llvm/Analysis/AliasAnalysis.h"#include "llvm/Analysis/ValueTracking.h"#include "llvm/CodeGen/DFAPacketizer.h"#include "llvm/CodeGen/LatencyPriorityQueue.h"#include "llvm/CodeGen/LiveIntervals.h"#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"#include "llvm/CodeGen/MachineDominators.h"#include "llvm/CodeGen/MachineFrameInfo.h"#include "llvm/CodeGen/MachineFunctionPass.h"#include "llvm/CodeGen/MachineInstrBuilder.h"#include "llvm/CodeGen/MachineLoopInfo.h"#include "llvm/CodeGen/MachineRegisterInfo.h"#include "llvm/CodeGen/Passes.h"#include "llvm/CodeGen/PseudoSourceValue.h"#include "llvm/CodeGen/SchedulerRegistry.h"#include "llvm/CodeGen/TargetInstrInfo.h"#include "llvm/CodeGen/TargetRegisterInfo.h"#include "llvm/CodeGen/TargetSchedule.h"#include "llvm/IR/Operator.h"#include "llvm/InitializePasses.h"#include "llvm/MC/MCInstrItineraries.h"#include "llvm/Support/CommandLine.h"#include "llvm/Support/Compiler.h"#include "llvm/Support/Debug.h"#include "llvm/Support/MathExtras.h"#include "llvm/Target/TargetMachine.h"#include "llvm/Transforms/Utils/BasicBlockUtils.h"#include <list>#include <map>Go to the source code of this file.
Namespaces | |
| namespace | llvm |
| This is an optimization pass for GlobalISel generic memory operations. | |
Macros | |
| #define | DEBUG_TYPE "global_sched" |
Functions | |
| STATISTIC (HexagonNumPullUps, "Number of instructions pull-ups") | |
| STATISTIC (HexagonNumDualJumps, "Number of dual jumps formed") | |
| FunctionPass * | llvm::createHexagonGlobalScheduler () |
| void | llvm::initializeHexagonGlobalSchedulerPass (PassRegistry &) |
| INITIALIZE_PASS_BEGIN (HexagonGlobalScheduler, "global-sched", "Hexagon Global Scheduler", false, false) INITIALIZE_PASS_END(HexagonGlobalScheduler | |
| static unsigned | nonDbgBundleSize (MachineBasicBlock::iterator &TargetPacket) |
| static bool | IsSchedBarrier (const MachineInstr *MI) |
| static bool | IsIndirectCall (const MachineInstr *MI) |
| static void | DumpLinked (MachineInstr *MI) |
| static void | DumpPacket (MachineBasicBlock::instr_iterator MII) |
| static void | DumpPacket (MachineBasicBlock::instr_iterator MII, MachineBasicBlock::instr_iterator BBEnd) |
| static bool | isBranch (MachineInstr *MI) |
| static MachineBasicBlock::instr_iterator | getHexagonFirstInstrTerminator (MachineBasicBlock *MBB) |
| static bool | selectBestBB (BlockFrequency &BBaFreq, unsigned BBaSize, BlockFrequency &BBbFreq, unsigned BBbSize) |
| Select best candidate to form regions. | |
| static bool | isGlobalMemoryObject (MachineInstr *MI) |
| Return true if MI is an instruction we are unable to reason about (like something with unmodeled memory side effects). | |
| static bool | isUnsafeMemoryObject (MachineInstr *MI) |
| static bool | MIsNeedChainEdge (AliasAnalysis *AA, const TargetInstrInfo *TII, MachineInstr *MIa, MachineInstr *MIb) |
| This returns true if the two MIs could be memory dependent. | |
| static void | parseOperands (MachineInstr *MI, SmallVector< unsigned, 4 > &Defs, SmallVector< unsigned, 8 > &Uses) |
| Gather register def/uses from MI. | |
| static bool | isDelayedUseException (MachineInstr *MIa, MachineInstr *MIb) |
| Some apparent dependencies are not actually restricting us since there is a delay between assignment and actual usage, like in case of a call. | |
| static bool | MIMustNotBePulledUp (MachineInstr *MI) |
| static bool | MIShouldNotBePulledUp (MachineInstr *MI) |
| static void | unmarkKillReg (MachineInstr *MI, unsigned Reg) |
| Find use with this reg, and unmark the kill flag. | |
| static void | markKillReg (MachineInstr *MI, unsigned Reg) |
| Find use with this reg, and unmark the kill flag. | |
| static void | debugLivenessForBB (const MachineBasicBlock *MBB, const TargetRegisterInfo *TRI) |
| static bool | IsEmptyBlock (MachineBasicBlock *MBB) |
| static MachineBasicBlock * | getBranchDestination (MachineInstr *MI) |
| Treat given instruction as a branch, go through its operands and see if any of them is a BB address. | |
| static void | updateBranches (MachineBasicBlock &InBlock, MachineBasicBlock *From, MachineBasicBlock *To) |
updateBranches - Updates all branches to From in the basic block InBlock to branches to To. | |
| static void | updatePredecessors (MachineBasicBlock &MBB, MachineBasicBlock *MFBB) |
| Rewrite all predecessors of the old block to go to the fallthrough instead. | |
| static void | UpdateCFG (MachineBasicBlock *HomeBB, MachineBasicBlock *OriginBB, MachineInstr *MII, MachineBasicBlock *HomeTBB, MachineBasicBlock *HomeFBB, MachineInstr *FTA, MachineInstr *STA, const MachineBranchProbabilityInfo *MBPI) |
| template<typename ElemType, typename IndexType> | |
| void | Unify (std::vector< ElemType > Range, std::map< ElemType, std::vector< IndexType > > &Set1, std::map< ElemType, std::vector< IndexType > > &Set2, std::pair< std::vector< IndexType >, std::vector< IndexType > > &UnionSet, unsigned union_size=100) |
| static void | UpdateBundle (MachineInstr *BundleHead) |
Variables | |
| static cl::opt< bool > | DisablePullUp ("disable-pull-up", cl::Hidden, cl::desc("Disable Hexagon pull-up pass")) |
| static cl::opt< bool > | EnableSpeculativePullUp ("enable-speculative-pull-up", cl::Hidden, cl::desc("Enable speculation during Hexagon pull-up pass")) |
| static cl::opt< bool > | EnableLocalPullUp ("enable-local-pull-up", cl::Hidden, cl::init(true), cl::desc("Enable same BB pull during Hexagon pull-up pass")) |
| static cl::opt< bool > | AllowSpeculateLoads ("speculate-loads-on-pull-up", cl::Hidden, cl::init(true), cl::desc("Allow speculative loads during Hexagon pull-up pass")) |
| static cl::opt< bool > | AllowCmpBranchLoads ("cmp-branch-loads-pull-up", cl::Hidden, cl::init(true), cl::desc("Allow compare-branch loads during Hexagon pull-up pass")) |
| static cl::opt< bool > | AllowUnlikelyPath ("unlikely-path-pull-up", cl::Hidden, cl::init(true), cl::desc("Allow unlikely path pull up")) |
| static cl::opt< bool > | PerformDualJumps ("dual-jump-in-pull-up", cl::Hidden, cl::init(true), cl::desc("Perform dual jump formation during pull up")) |
| static cl::opt< bool > | AllowDependentPullUp ("enable-dependent-pull-up", cl::Hidden, cl::init(true), cl::desc("Perform dual jump formation during pull up")) |
| static cl::opt< bool > | AllowBBPeelPullUp ("enable-bb-peel-pull-up", cl::Hidden, cl::init(true), cl::desc("Peel a reg copy out of a BBloop")) |
| static cl::opt< bool > | PreventCompoundSeparation ("prevent-compound-separation", cl::Hidden, cl::desc("Do not destroy existing compounds during pull up")) |
| static cl::opt< bool > | PreventDuplexSeparation ("prevent-duplex-separation", cl::Hidden, cl::init(true), cl::desc("Do not destroy existing duplexes during pull up")) |
| static cl::opt< unsigned > | MainCandidateQueueSize ("pull-up-main-queue-size", cl::Hidden, cl::init(8)) |
| static cl::opt< unsigned > | SecondaryCandidateQueueSize ("pull-up-sec-queue-size", cl::Hidden, cl::init(2)) |
| static cl::opt< bool > | PostPullUpOpt ("post-pull-up-opt", cl::Hidden, cl::Optional, cl::init(true), cl::desc("Enable opt. exposed by pull-up e.g., remove redundant jumps")) |
| static cl::opt< bool > | SpeculateNonPredInsn ("speculate-non-pred-insn", cl::Hidden, cl::Optional, cl::init(true), cl::desc("Speculate non-predicable instructions in parent BB")) |
| static cl::opt< bool > | DisableCheckBundles ("disable-hexagon-check-bundles", cl::Hidden, cl::init(true), cl::desc("Disable Hexagon check bundles pass")) |
| static cl::opt< bool > | WarnOnBundleSize ("warn-on-bundle-size", cl::Hidden, cl::desc("Hexagon check bundles and warn on size")) |
| static cl::opt< bool > | ForceNoopHazards ("force-noop-hazards", cl::Hidden, cl::init(false), cl::desc("Force noop hazards in scheduler")) |
| static cl::opt< bool > | OneFloatPerPacket ("single-float-packet", cl::Hidden, cl::desc("Allow only one single floating point instruction in a packet")) |
| static cl::opt< bool > | OneComplexPerPacket ("single-complex-packet", cl::Hidden, cl::desc("Allow only one complex instruction in a packet")) |
| global | sched |
| global Hexagon Global | Scheduler |
| global Hexagon Global | false |
| static const unsigned | SafetyBuffer = 200 |
| #define DEBUG_TYPE "global_sched" |
Definition at line 59 of file HexagonGlobalScheduler.cpp.
|
static |
Definition at line 2466 of file HexagonGlobalScheduler.cpp.
References llvm::dbgs(), E(), I, LLVM_DEBUG, MBB, llvm::printReg(), and TRI.
|
static |
Definition at line 690 of file HexagonGlobalScheduler.cpp.
References llvm::dbgs(), and MI.
Referenced by DumpPacket().
|
static |
Definition at line 702 of file HexagonGlobalScheduler.cpp.
References llvm::dbgs(), DumpLinked(), MBB, and MI.
Referenced by DumpPacket().
|
static |
Definition at line 727 of file HexagonGlobalScheduler.cpp.
References llvm::dbgs(), and DumpPacket().
|
inlinestatic |
Treat given instruction as a branch, go through its operands and see if any of them is a BB address.
If so, return it. Return NULL otherwise.
Definition at line 2498 of file HexagonGlobalScheduler.cpp.
References llvm::MachineOperand::getMBB(), llvm::MachineOperand::isMBB(), and MI.
Referenced by UpdateCFG().
|
static |
Definition at line 835 of file HexagonGlobalScheduler.cpp.
References MBB.
| INITIALIZE_PASS_BEGIN | ( | HexagonGlobalScheduler | , |
| "global-sched" | , | ||
| "Hexagon Global Scheduler" | , | ||
| false | , | ||
| false | ) |
References INITIALIZE_PASS_DEPENDENCY.
|
static |
Definition at line 738 of file HexagonGlobalScheduler.cpp.
References MI.
|
static |
Some apparent dependencies are not actually restricting us since there is a delay between assignment and actual usage, like in case of a call.
There could be more cases here, but this one seems the most obvious.
Definition at line 1267 of file HexagonGlobalScheduler.cpp.
References llvm::MachineInstr::isCall().
|
static |
Definition at line 2484 of file HexagonGlobalScheduler.cpp.
|
inlinestatic |
Return true if MI is an instruction we are unable to reason about (like something with unmodeled memory side effects).
Definition at line 1120 of file HexagonGlobalScheduler.cpp.
References MI.
|
static |
Definition at line 685 of file HexagonGlobalScheduler.cpp.
References MI.
Referenced by canSinkInstructions(), llvm::NVPTXTargetLowering::LowerCall(), mergeCompatibleInvokesImpl(), and llvm::IRSimilarity::IRInstructionMapper::InstructionClassification::visitCallInst().
|
static |
Definition at line 681 of file HexagonGlobalScheduler.cpp.
References MI.
Referenced by MIMustNotBePulledUp().
|
inlinestatic |
Definition at line 1130 of file HexagonGlobalScheduler.cpp.
References MI.
Referenced by MIsNeedChainEdge().
|
inlinestatic |
Find use with this reg, and unmark the kill flag.
Definition at line 2148 of file HexagonGlobalScheduler.cpp.
References llvm::MachineOperand::getReg(), llvm::MachineOperand::isReg(), llvm::MachineOperand::isUse(), MI, Reg, and llvm::MachineOperand::setIsKill().
|
inlinestatic |
Definition at line 1683 of file HexagonGlobalScheduler.cpp.
References IsSchedBarrier(), and MI.
Referenced by MIShouldNotBePulledUp().
|
inlinestatic |
Definition at line 1689 of file HexagonGlobalScheduler.cpp.
References MI, and MIMustNotBePulledUp().
|
static |
This returns true if the two MIs could be memory dependent.
Definition at line 1147 of file HexagonGlobalScheduler.cpp.
References assert(), llvm::MachineMemOperand::getAAInfo(), llvm::MachineMemOperand::getOffset(), llvm::MachineMemOperand::getSize(), llvm::LocationSize::getValue(), llvm::MachineMemOperand::getValue(), llvm::MachineInstr::hasOneMemOperand(), llvm::LocationSize::hasValue(), isUnsafeMemoryObject(), llvm::MachineInstr::mayStore(), llvm::MachineInstr::memoperands_begin(), llvm::AliasResult::NoAlias, and TII.
|
static |
Definition at line 598 of file HexagonGlobalScheduler.cpp.
References llvm::count(), and llvm::MachineInstrBundleIterator< Ty, IsReverse >::getInstrIterator().
|
inlinestatic |
Gather register def/uses from MI.
This treats possible (predicated) defs as actually happening ones (conservatively).
Definition at line 1213 of file HexagonGlobalScheduler.cpp.
References assert(), llvm::SmallVectorImpl< T >::clear(), llvm::MachineOperand::clobbersPhysReg(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isDef(), llvm::Register::isPhysicalRegister(), llvm::MachineOperand::isReg(), llvm::MachineOperand::isRegMask(), llvm::MachineOperand::isUse(), MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, and Uses.
Referenced by llvm::HexagonInstrInfo::isDependent().
|
inlinestatic |
Select best candidate to form regions.
Definition at line 986 of file HexagonGlobalScheduler.cpp.
References llvm::BlockFrequency::getFrequency().
| STATISTIC | ( | HexagonNumDualJumps | , |
| "Number of dual jumps formed" | ) |
| STATISTIC | ( | HexagonNumPullUps | , |
| "Number of instructions pull-ups" | ) |
| void Unify | ( | std::vector< ElemType > | Range, |
| std::map< ElemType, std::vector< IndexType > > & | Set1, | ||
| std::map< ElemType, std::vector< IndexType > > & | Set2, | ||
| std::pair< std::vector< IndexType >, std::vector< IndexType > > & | UnionSet, | ||
| unsigned | union_size = 100 ) |
Definition at line 3282 of file HexagonGlobalScheduler.cpp.
References assert(), llvm::dbgs(), LLVM_DEBUG, and Range.
|
inlinestatic |
Find use with this reg, and unmark the kill flag.
Definition at line 2132 of file HexagonGlobalScheduler.cpp.
References llvm::MachineOperand::getReg(), llvm::MachineOperand::isKill(), llvm::MachineOperand::isReg(), MI, Reg, and llvm::MachineOperand::setIsKill().
|
static |
updateBranches - Updates all branches to From in the basic block InBlock to branches to To.
Definition at line 2703 of file HexagonGlobalScheduler.cpp.
References E(), llvm::MachineOperand::getMBB(), InBlock(), llvm::MachineInstr::isBranch(), llvm::MachineOperand::isMBB(), llvm::MachineInstr::operands_begin(), llvm::MachineInstr::operands_end(), and llvm::MachineOperand::setMBB().
|
static |
Definition at line 3322 of file HexagonGlobalScheduler.cpp.
References assert(), llvm::MachineInstr::eraseFromParent(), llvm::MachineInstr::getBundleSize(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineInstr::isBundle(), MI, and Size.
Referenced by INITIALIZE_PASS().
|
static |
Definition at line 2749 of file HexagonGlobalScheduler.cpp.
References llvm::MachineBasicBlock::addSuccessor(), llvm::dbgs(), llvm::MachineFunction::end(), getBranchDestination(), llvm::MachineBranchProbabilityInfo::getEdgeProbability(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineBasicBlock::getParent(), llvm::MachineInstr::isConditionalBranch(), llvm::MachineBasicBlock::isLayoutSuccessor(), llvm::MachineBasicBlock::isSuccessor(), llvm::MachineInstr::isUnconditionalBranch(), LLVM_DEBUG, and llvm::MachineBasicBlock::removeSuccessor().
|
static |
Rewrite all predecessors of the old block to go to the fallthrough instead.
NB: Collect predecessors into a snapshot vector before iterating to avoid iterator invalidation on MBB's predecessor list. Each call to ReplaceUsesOfBlockWith modifies both the successor list of Pred and the predecessor list of MBB, which invalidates debug-mode iterators (detected by _GLIBCXX_DEBUG).
Definition at line 2732 of file HexagonGlobalScheduler.cpp.
References llvm::MachineFunction::end(), llvm::ilist_node_impl< OptionsT >::getIterator(), MBB, and updateBranches().
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
| global Hexagon Global false |
Definition at line 579 of file HexagonGlobalScheduler.cpp.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Definition at line 832 of file HexagonGlobalScheduler.cpp.
| global sched |
Definition at line 578 of file HexagonGlobalScheduler.cpp.
| global Hexagon Global Scheduler |
Definition at line 579 of file HexagonGlobalScheduler.cpp.
|
static |
|
static |