16 #define DEBUG_TYPE "x86-fixup-LEAs"
31 STATISTIC(NumLEAs,
"Number of LEA instructions created");
35 enum RegUsageState { RU_NotUsed, RU_Write, RU_Read };
42 virtual const char *getPassName()
const {
return "X86 Atom LEA Fixup";}
105 TII->get( MI->
getOpcode() == X86::MOV32rr ? X86::LEA32r : X86::LEA64r))
108 MFI->insert(MBBI, NewMI);
113 case X86::ADD64ri32_DB:
114 case X86::ADD64ri8_DB:
117 case X86::ADD32ri_DB:
118 case X86::ADD32ri8_DB:
121 case X86::ADD16ri_DB:
122 case X86::ADD16ri8_DB:
130 case X86::ADD16rr_DB:
138 return TII->convertToThreeAddress(MFI, MBBI, 0);
142 return new FixupLEAPass();
147 TM = &MF->getTarget();
148 TII =
TM->getInstrInfo();
150 DEBUG(
dbgs() <<
"Start X86FixupLEAs\n";);
153 processBasicBlock(Func,
I);
159 FixupLEAPass::RegUsageState FixupLEAPass::usesRegister(
MachineOperand& p,
161 RegUsageState RegUsage = RU_NotUsed;
181 if (I == MFI->begin()) {
182 if (MFI->isPredecessor(MFI)) {
196 int InstrDistance = 1;
198 static const int INSTR_DISTANCE_THRESHOLD = 5;
203 while( Found && I != CurInst) {
204 if (CurInst->isCall() || CurInst->isInlineAsm())
206 if (InstrDistance > INSTR_DISTANCE_THRESHOLD)
208 if (usesRegister(p, CurInst) == RU_Write){
211 InstrDistance +=
TII->getInstrLatency(
TM->getInstrItineraryData(), CurInst);
224 if (AddrOffset >= 0) {
228 seekLEAFixup(p, I, MFI);
232 seekLEAFixup(q, I, MFI);
245 DEBUG(
dbgs() <<
"Candidate to replace:"; MBI->dump(););
251 processInstruction(J, MFI);
260 processInstruction(I, MFI);
static bool getPreviousInstr(MachineBasicBlock::iterator &I, MachineFunction::iterator MFI)
const MCInstrDesc & getDesc() const
int getOperandBias(const MCInstrDesc &Desc)
STATISTIC(NumLEAs,"Number of LEA instructions created")
const HexagonInstrInfo * TII
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
ID
LLVM Calling Convention Representation.
const MachineInstrBuilder & addImm(int64_t Val) const
unsigned getNumOperands() const
FunctionPass * createX86FixupLEAs()
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
unsigned getReg() const
getReg - Returns the register number.
int getMemoryOperandNo(uint64_t TSFlags, unsigned Opcode)
const MachineInstrBuilder & addOperand(const MachineOperand &MO) const
BasicBlockListType::iterator iterator
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
DebugLoc getDebugLoc() const