28#define DEBUG_TYPE "localizer"
59 LocalizedSetVecT &LocalizedInstrs);
62 bool localizeIntraBlock(LocalizedSetVecT &LocalizedInstrs);
73 "Move/duplicate certain instructions close to their use",
77 "Move/duplicate certain instructions close to their use",
101 return InsertMBB == Def.getParent();
110 unsigned NumUses = 0;
111 for (
unsigned I = 0, NumVals =
MI->getNumIncomingValues();
I < NumVals; ++
I) {
112 if (
MI->getIncomingValue(
I) == SrcReg)
119 LocalizedSetVecT &LocalizedInstrs) {
121 DenseMap<std::pair<MachineBasicBlock *, Register>,
Register> MBBWithLocalDef;
130 if (!TL.shouldLocalize(
MI,
TTI))
133 assert(
MI.getDesc().getNumDefs() == 1 &&
134 "More than one definition not supported yet");
139 for (MachineOperand &MOUse :
142 MachineBasicBlock *InsertMBB;
144 dbgs() <<
"Checking use: " << MIUse
146 if (isLocalUse(MOUse,
MI, InsertMBB)) {
150 LocalizedInstrs.insert(&
MI);
157 unsigned NumPhiUses = getNumPhiUses(MOUse);
158 const unsigned PhiThreshold = 2;
159 if (NumPhiUses > PhiThreshold)
164 auto MBBAndReg = std::make_pair(InsertMBB,
Reg);
165 auto NewVRegIt = MBBWithLocalDef.
find(MBBAndReg);
166 if (NewVRegIt == MBBWithLocalDef.
end()) {
168 MachineInstr *LocalizedMI = MF.CloneMachineInstr(&
MI);
169 LocalizedInstrs.
insert(LocalizedMI);
181 MBBWithLocalDef.
try_emplace(MBBAndReg, NewReg).first;
187 MOUse.
setReg(NewVRegIt->second);
193bool LocalizerImpl::localizeIntraBlock(LocalizedSetVecT &LocalizedInstrs) {
202 for (MachineInstr *
MI : LocalizedInstrs) {
206 SmallPtrSet<MachineInstr *, 32>
Users;
228 MI->removeFromParent();
234 if (
Users.size() == 1) {
235 const auto &DefDL =
MI->getDebugLoc();
236 const auto &UserDL = (*
Users.begin())->getDebugLoc();
238 if ((!DefDL || DefDL.getLine() == 0) && UserDL && UserDL.getLine() != 0) {
239 MI->setDebugLoc(UserDL);
246bool LocalizerImpl::runOnMachineFunction(
258 LocalizedSetVecT LocalizedInstrs;
260 bool Changed = localizeInterBlock(MF, LocalizedInstrs);
261 Changed |= localizeIntraBlock(LocalizedInstrs);
267 return Impl.runOnMachineFunction(MF, [&]() {
277 bool Changed = Impl.runOnMachineFunction(MF, [&]() {
MachineInstrBuilder & UseMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the DenseMap class.
Declares convenience wrapper classes for interpreting MachineInstr instances as specific generic oper...
iv Induction Variable Users
Promote Memory to Register
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file implements a set that has insertion order iteration characteristics.
This file describes how to lower LLVM code to machine code.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Represents analyses that only rely on functions' control flow.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
This pass implements the localization mechanism described at the top of this file.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
An RAII based helper class to modify MachineFunctionProperties when running pass.
LLVM_ABI iterator getFirstTerminatorForward()
Finds the first terminator in a block by scanning forward.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass(char &ID)
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.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineBasicBlock & front() const
void insert(iterator MBBI, MachineBasicBlock *MBB)
Representation of each machine instruction.
const MachineBasicBlock * getParent() const
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
MachineBasicBlock * getMBB() const
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool hasOneUse(Register RegNo) const
hasOneUse - Return true if there is exactly one instruction using the specified register.
iterator_range< use_instr_nodbg_iterator > use_nodbg_instructions(Register Reg) const
LLVM_ABI Register cloneVirtualRegister(Register VReg, StringRef Name="")
Create and return a new virtual register in the function with the same attributes as the given regist...
iterator_range< use_iterator > use_operands(Register Reg) const
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Wrapper class representing virtual and physical registers.
A SetVector that performs no allocations if smaller than a certain size.
Analysis pass providing the TargetTransformInfo.
virtual const TargetLowering * getTargetLowering() const
An efficient, type-erasing, non-owning reference to a callable.
Pass manager infrastructure for declaring and invalidating analyses.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU)
Modify analysis usage so it preserves passes required for the SelectionDAG fallback.
DWARFExpression::Operation Op
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.