33 #define DEBUG_TYPE "x86-pad-short-functions"
35 STATISTIC(NumBBsPadded,
"Number of basic blocks padded");
38 struct VisitedBBInfo {
46 VisitedBBInfo() : HasReturn(
false), Cycles(0) {}
47 VisitedBBInfo(
bool HasReturn,
unsigned int Cycles)
48 : HasReturn(HasReturn), Cycles(Cycles) {}
64 return "X86 Atom pad short functions";
69 unsigned int Cycles = 0);
72 unsigned int &Cycles);
76 unsigned int NOOPsToAdd);
95 return new PadShortFunc();
109 if (!STI->padShortFunctions())
112 TII = STI->getInstrInfo();
117 findReturns(&MF.
front());
119 bool MadeChange =
false;
122 unsigned int Cycles = 0;
126 I != ReturnBBs.end(); ++
I) {
134 "Basic block should contain at least a RET but is empty");
137 while (ReturnLoc->isDebugValue())
139 assert(ReturnLoc->isReturn() && !ReturnLoc->isCall() &&
140 "Basic block does not end with RET");
142 addPadding(MBB, ReturnLoc,
Threshold - Cycles);
155 bool hasReturn = cyclesUntilReturn(MBB, Cycles);
160 ReturnBBs[
MBB] = std::max(ReturnBBs[MBB], Cycles);
169 findReturns(*
I, Cycles);
178 unsigned int &Cycles) {
181 = VisitedBBs.
find(MBB);
182 if (it != VisitedBBs.
end()) {
183 VisitedBBInfo BBInfo = it->second;
184 Cycles += BBInfo.Cycles;
185 return BBInfo.HasReturn;
188 unsigned int CyclesToEnd = 0;
194 if (
MI.isReturn() && !
MI.isCall()) {
195 VisitedBBs[
MBB] = VisitedBBInfo(
true, CyclesToEnd);
196 Cycles += CyclesToEnd;
203 VisitedBBs[
MBB] = VisitedBBInfo(
false, CyclesToEnd);
204 Cycles += CyclesToEnd;
212 unsigned int NOOPsToAdd) {
215 while (NOOPsToAdd-- > 0) {
STATISTIC(NumFunctions,"Total number of functions")
const Function * getFunction() const
getFunction - Return the LLVM function that this machine code represents
bool optForSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const HexagonInstrInfo * TII
FunctionPass * createX86PadShortFunctions()
Return a pass that pads short functions with NOOPs.
std::vector< MachineBasicBlock * >::iterator succ_iterator
const MachineBasicBlock & front() const
Function Alias Analysis false
unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const override
Compute the instruction latency of a given instruction.
TargetInstrInfo - Interface to description of machine instruction set.
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
FunctionPass class - This class is used to implement most global optimizations.
succ_iterator succ_begin()
static bool hasReturn(const MachineBasicBlock &MBB)
Returns true if MBB contains an instruction that returns.
MachineFunctionProperties & set(Property P)
Representation of each machine instruction.
iterator find(const KeyT &Val)
static int const Threshold
TODO: Write a new FunctionPass AliasAnalysis so that it can keep a cache.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
StringRef - Represent a constant reference to a string, i.e.
Properties which a MachineFunction may have at a given point in time.