LLVM  8.0.1
X86FixupLEAs.cpp
Go to the documentation of this file.
1 //===-- X86FixupLEAs.cpp - use or replace LEA instructions -----------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the pass that finds instructions that can be
11 // re-written as LEA instructions in order to reduce pipeline delays.
12 // When optimizing for size it replaces suitable LEAs with INC or DEC.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "X86.h"
17 #include "X86InstrInfo.h"
18 #include "X86Subtarget.h"
19 #include "llvm/ADT/Statistic.h"
22 #include "llvm/CodeGen/Passes.h"
24 #include "llvm/Support/Debug.h"
26 using namespace llvm;
27 
28 #define FIXUPLEA_DESC "X86 LEA Fixup"
29 #define FIXUPLEA_NAME "x86-fixup-LEAs"
30 
31 #define DEBUG_TYPE FIXUPLEA_NAME
32 
33 STATISTIC(NumLEAs, "Number of LEA instructions created");
34 
35 namespace {
36 class FixupLEAPass : public MachineFunctionPass {
37  enum RegUsageState { RU_NotUsed, RU_Write, RU_Read };
38 
39  /// Loop over all of the instructions in the basic block
40  /// replacing applicable instructions with LEA instructions,
41  /// where appropriate.
42  bool processBasicBlock(MachineFunction &MF, MachineFunction::iterator MFI,
43  bool IsSlowLEA, bool IsSlow3OpsLEA);
44 
45  /// Given a machine register, look for the instruction
46  /// which writes it in the current basic block. If found,
47  /// try to replace it with an equivalent LEA instruction.
48  /// If replacement succeeds, then also process the newly created
49  /// instruction.
50  void seekLEAFixup(MachineOperand &p, MachineBasicBlock::iterator &I,
52 
53  /// Given a memory access or LEA instruction
54  /// whose address mode uses a base and/or index register, look for
55  /// an opportunity to replace the instruction which sets the base or index
56  /// register with an equivalent LEA instruction.
57  void processInstruction(MachineBasicBlock::iterator &I,
59 
60  /// Given a LEA instruction which is unprofitable
61  /// on SlowLEA targets try to replace it with an equivalent ADD instruction.
62  void processInstructionForSlowLEA(MachineBasicBlock::iterator &I,
64 
65  /// Given a LEA instruction which is unprofitable
66  /// on SNB+ try to replace it with other instructions.
67  /// According to Intel's Optimization Reference Manual:
68  /// " For LEA instructions with three source operands and some specific
69  /// situations, instruction latency has increased to 3 cycles, and must
70  /// dispatch via port 1:
71  /// - LEA that has all three source operands: base, index, and offset
72  /// - LEA that uses base and index registers where the base is EBP, RBP,
73  /// or R13
74  /// - LEA that uses RIP relative addressing mode
75  /// - LEA that uses 16-bit addressing mode "
76  /// This function currently handles the first 2 cases only.
77  MachineInstr *processInstrForSlow3OpLEA(MachineInstr &MI,
79 
80  /// Look for LEAs that add 1 to reg or subtract 1 from reg
81  /// and convert them to INC or DEC respectively.
82  bool fixupIncDec(MachineBasicBlock::iterator &I,
83  MachineFunction::iterator MFI) const;
84 
85  /// Determine if an instruction references a machine register
86  /// and, if so, whether it reads or writes the register.
87  RegUsageState usesRegister(MachineOperand &p, MachineBasicBlock::iterator I);
88 
89  /// Step backwards through a basic block, looking
90  /// for an instruction which writes a register within
91  /// a maximum of INSTR_DISTANCE_THRESHOLD instruction latency cycles.
95 
96  /// if an instruction can be converted to an
97  /// equivalent LEA, insert the new instruction into the basic block
98  /// and return a pointer to it. Otherwise, return zero.
99  MachineInstr *postRAConvertToLEA(MachineFunction::iterator &MFI,
100  MachineBasicBlock::iterator &MBBI) const;
101 
102 public:
103  static char ID;
104 
105  StringRef getPassName() const override { return FIXUPLEA_DESC; }
106 
107  FixupLEAPass() : MachineFunctionPass(ID) {
109  }
110 
111  /// Loop over all of the basic blocks,
112  /// replacing instructions by equivalent LEA instructions
113  /// if needed and when possible.
114  bool runOnMachineFunction(MachineFunction &MF) override;
115 
116  // This pass runs after regalloc and doesn't support VReg operands.
117  MachineFunctionProperties getRequiredProperties() const override {
120  }
121 
122 private:
123  TargetSchedModel TSM;
124  MachineFunction *MF;
125  const X86InstrInfo *TII; // Machine instruction info.
126  bool OptIncDec;
127  bool OptLEA;
128 };
129 }
130 
131 char FixupLEAPass::ID = 0;
132 
133 INITIALIZE_PASS(FixupLEAPass, FIXUPLEA_NAME, FIXUPLEA_DESC, false, false)
134 
135 MachineInstr *
136 FixupLEAPass::postRAConvertToLEA(MachineFunction::iterator &MFI,
137  MachineBasicBlock::iterator &MBBI) const {
138  MachineInstr &MI = *MBBI;
139  switch (MI.getOpcode()) {
140  case X86::MOV32rr:
141  case X86::MOV64rr: {
142  const MachineOperand &Src = MI.getOperand(1);
143  const MachineOperand &Dest = MI.getOperand(0);
144  MachineInstr *NewMI =
145  BuildMI(*MF, MI.getDebugLoc(),
146  TII->get(MI.getOpcode() == X86::MOV32rr ? X86::LEA32r
147  : X86::LEA64r))
148  .add(Dest)
149  .add(Src)
150  .addImm(1)
151  .addReg(0)
152  .addImm(0)
153  .addReg(0);
154  MFI->insert(MBBI, NewMI); // Insert the new inst
155  return NewMI;
156  }
157  case X86::ADD64ri32:
158  case X86::ADD64ri8:
159  case X86::ADD64ri32_DB:
160  case X86::ADD64ri8_DB:
161  case X86::ADD32ri:
162  case X86::ADD32ri8:
163  case X86::ADD32ri_DB:
164  case X86::ADD32ri8_DB:
165  case X86::ADD16ri:
166  case X86::ADD16ri8:
167  case X86::ADD16ri_DB:
168  case X86::ADD16ri8_DB:
169  if (!MI.getOperand(2).isImm()) {
170  // convertToThreeAddress will call getImm()
171  // which requires isImm() to be true
172  return nullptr;
173  }
174  break;
175  case X86::ADD16rr:
176  case X86::ADD16rr_DB:
177  if (MI.getOperand(1).getReg() != MI.getOperand(2).getReg()) {
178  // if src1 != src2, then convertToThreeAddress will
179  // need to create a Virtual register, which we cannot do
180  // after register allocation.
181  return nullptr;
182  }
183  }
184  return TII->convertToThreeAddress(MFI, MI, nullptr);
185 }
186 
187 FunctionPass *llvm::createX86FixupLEAs() { return new FixupLEAPass(); }
188 
189 bool FixupLEAPass::runOnMachineFunction(MachineFunction &Func) {
190  if (skipFunction(Func.getFunction()))
191  return false;
192 
193  MF = &Func;
194  const X86Subtarget &ST = Func.getSubtarget<X86Subtarget>();
195  bool IsSlowLEA = ST.slowLEA();
196  bool IsSlow3OpsLEA = ST.slow3OpsLEA();
197 
198  OptIncDec = !ST.slowIncDec() || Func.getFunction().optForMinSize();
199  OptLEA = ST.LEAusesAG() || IsSlowLEA || IsSlow3OpsLEA;
200 
201  if (!OptLEA && !OptIncDec)
202  return false;
203 
204  TSM.init(&Func.getSubtarget());
205  TII = ST.getInstrInfo();
206 
207  LLVM_DEBUG(dbgs() << "Start X86FixupLEAs\n";);
208  // Process all basic blocks.
209  for (MachineFunction::iterator I = Func.begin(), E = Func.end(); I != E; ++I)
210  processBasicBlock(Func, I, IsSlowLEA, IsSlow3OpsLEA);
211  LLVM_DEBUG(dbgs() << "End X86FixupLEAs\n";);
212 
213  return true;
214 }
215 
216 FixupLEAPass::RegUsageState
217 FixupLEAPass::usesRegister(MachineOperand &p, MachineBasicBlock::iterator I) {
218  RegUsageState RegUsage = RU_NotUsed;
219  MachineInstr &MI = *I;
220 
221  for (unsigned int i = 0; i < MI.getNumOperands(); ++i) {
222  MachineOperand &opnd = MI.getOperand(i);
223  if (opnd.isReg() && opnd.getReg() == p.getReg()) {
224  if (opnd.isDef())
225  return RU_Write;
226  RegUsage = RU_Read;
227  }
228  }
229  return RegUsage;
230 }
231 
232 /// getPreviousInstr - Given a reference to an instruction in a basic
233 /// block, return a reference to the previous instruction in the block,
234 /// wrapping around to the last instruction of the block if the block
235 /// branches to itself.
238  if (I == MFI->begin()) {
239  if (MFI->isPredecessor(&*MFI)) {
240  I = --MFI->end();
241  return true;
242  } else
243  return false;
244  }
245  --I;
246  return true;
247 }
248 
250 FixupLEAPass::searchBackwards(MachineOperand &p, MachineBasicBlock::iterator &I,
252  int InstrDistance = 1;
254  static const int INSTR_DISTANCE_THRESHOLD = 5;
255 
256  CurInst = I;
257  bool Found;
258  Found = getPreviousInstr(CurInst, MFI);
259  while (Found && I != CurInst) {
260  if (CurInst->isCall() || CurInst->isInlineAsm())
261  break;
262  if (InstrDistance > INSTR_DISTANCE_THRESHOLD)
263  break; // too far back to make a difference
264  if (usesRegister(p, CurInst) == RU_Write) {
265  return CurInst;
266  }
267  InstrDistance += TSM.computeInstrLatency(&*CurInst);
268  Found = getPreviousInstr(CurInst, MFI);
269  }
271 }
272 
273 static inline bool isLEA(const int Opcode) {
274  return Opcode == X86::LEA16r || Opcode == X86::LEA32r ||
275  Opcode == X86::LEA64r || Opcode == X86::LEA64_32r;
276 }
277 
278 static inline bool isInefficientLEAReg(unsigned int Reg) {
279  return Reg == X86::EBP || Reg == X86::RBP ||
280  Reg == X86::R13D || Reg == X86::R13;
281 }
282 
283 static inline bool isRegOperand(const MachineOperand &Op) {
284  return Op.isReg() && Op.getReg() != X86::NoRegister;
285 }
286 
287 /// Returns true if this LEA uses base an index registers, and the base register
288 /// is known to be inefficient for the subtarget.
289 // TODO: use a variant scheduling class to model the latency profile
290 // of LEA instructions, and implement this logic as a scheduling predicate.
291 static inline bool hasInefficientLEABaseReg(const MachineOperand &Base,
292  const MachineOperand &Index) {
293  return Base.isReg() && isInefficientLEAReg(Base.getReg()) &&
294  isRegOperand(Index);
295 }
296 
297 static inline bool hasLEAOffset(const MachineOperand &Offset) {
298  return (Offset.isImm() && Offset.getImm() != 0) || Offset.isGlobal();
299 }
300 
301 static inline int getADDrrFromLEA(int LEAOpcode) {
302  switch (LEAOpcode) {
303  default:
304  llvm_unreachable("Unexpected LEA instruction");
305  case X86::LEA16r:
306  return X86::ADD16rr;
307  case X86::LEA32r:
308  return X86::ADD32rr;
309  case X86::LEA64_32r:
310  case X86::LEA64r:
311  return X86::ADD64rr;
312  }
313 }
314 
315 static inline int getADDriFromLEA(int LEAOpcode, const MachineOperand &Offset) {
316  bool IsInt8 = Offset.isImm() && isInt<8>(Offset.getImm());
317  switch (LEAOpcode) {
318  default:
319  llvm_unreachable("Unexpected LEA instruction");
320  case X86::LEA16r:
321  return IsInt8 ? X86::ADD16ri8 : X86::ADD16ri;
322  case X86::LEA32r:
323  case X86::LEA64_32r:
324  return IsInt8 ? X86::ADD32ri8 : X86::ADD32ri;
325  case X86::LEA64r:
326  return IsInt8 ? X86::ADD64ri8 : X86::ADD64ri32;
327  }
328 }
329 
330 /// isLEASimpleIncOrDec - Does this LEA have one these forms:
331 /// lea %reg, 1(%reg)
332 /// lea %reg, -1(%reg)
333 static inline bool isLEASimpleIncOrDec(MachineInstr &LEA) {
334  unsigned SrcReg = LEA.getOperand(1 + X86::AddrBaseReg).getReg();
335  unsigned DstReg = LEA.getOperand(0).getReg();
337  return SrcReg == DstReg &&
338  LEA.getOperand(1 + X86::AddrIndexReg).getReg() == 0 &&
339  LEA.getOperand(1 + X86::AddrSegmentReg).getReg() == 0 &&
340  AddrDisp.isImm() &&
341  (AddrDisp.getImm() == 1 || AddrDisp.getImm() == -1);
342 }
343 
344 bool FixupLEAPass::fixupIncDec(MachineBasicBlock::iterator &I,
345  MachineFunction::iterator MFI) const {
346  MachineInstr &MI = *I;
347  int Opcode = MI.getOpcode();
348  if (!isLEA(Opcode))
349  return false;
350 
351  if (isLEASimpleIncOrDec(MI) && TII->isSafeToClobberEFLAGS(*MFI, I)) {
352  int NewOpcode;
353  bool isINC = MI.getOperand(1 + X86::AddrDisp).getImm() == 1;
354  switch (Opcode) {
355  case X86::LEA16r:
356  NewOpcode = isINC ? X86::INC16r : X86::DEC16r;
357  break;
358  case X86::LEA32r:
359  case X86::LEA64_32r:
360  NewOpcode = isINC ? X86::INC32r : X86::DEC32r;
361  break;
362  case X86::LEA64r:
363  NewOpcode = isINC ? X86::INC64r : X86::DEC64r;
364  break;
365  }
366 
367  MachineInstr *NewMI =
368  BuildMI(*MFI, I, MI.getDebugLoc(), TII->get(NewOpcode))
369  .add(MI.getOperand(0))
370  .add(MI.getOperand(1 + X86::AddrBaseReg));
371  MFI->erase(I);
372  I = static_cast<MachineBasicBlock::iterator>(NewMI);
373  return true;
374  }
375  return false;
376 }
377 
378 void FixupLEAPass::processInstruction(MachineBasicBlock::iterator &I,
380  // Process a load, store, or LEA instruction.
381  MachineInstr &MI = *I;
382  const MCInstrDesc &Desc = MI.getDesc();
383  int AddrOffset = X86II::getMemoryOperandNo(Desc.TSFlags);
384  if (AddrOffset >= 0) {
385  AddrOffset += X86II::getOperandBias(Desc);
386  MachineOperand &p = MI.getOperand(AddrOffset + X86::AddrBaseReg);
387  if (p.isReg() && p.getReg() != X86::ESP) {
388  seekLEAFixup(p, I, MFI);
389  }
390  MachineOperand &q = MI.getOperand(AddrOffset + X86::AddrIndexReg);
391  if (q.isReg() && q.getReg() != X86::ESP) {
392  seekLEAFixup(q, I, MFI);
393  }
394  }
395 }
396 
397 void FixupLEAPass::seekLEAFixup(MachineOperand &p,
400  MachineBasicBlock::iterator MBI = searchBackwards(p, I, MFI);
401  if (MBI != MachineBasicBlock::iterator()) {
402  MachineInstr *NewMI = postRAConvertToLEA(MFI, MBI);
403  if (NewMI) {
404  ++NumLEAs;
405  LLVM_DEBUG(dbgs() << "FixLEA: Candidate to replace:"; MBI->dump(););
406  // now to replace with an equivalent LEA...
407  LLVM_DEBUG(dbgs() << "FixLEA: Replaced by: "; NewMI->dump(););
408  MFI->erase(MBI);
410  static_cast<MachineBasicBlock::iterator>(NewMI);
411  processInstruction(J, MFI);
412  }
413  }
414 }
415 
416 void FixupLEAPass::processInstructionForSlowLEA(MachineBasicBlock::iterator &I,
418  MachineInstr &MI = *I;
419  const int Opcode = MI.getOpcode();
420  if (!isLEA(Opcode))
421  return;
422 
423  const MachineOperand &Dst = MI.getOperand(0);
425  const MachineOperand &Scale = MI.getOperand(1 + X86::AddrScaleAmt);
428  const MachineOperand &Segment = MI.getOperand(1 + X86::AddrSegmentReg);
429 
430  if (Segment.getReg() != 0 || !Offset.isImm() ||
431  !TII->isSafeToClobberEFLAGS(*MFI, I))
432  return;
433  const unsigned DstR = Dst.getReg();
434  const unsigned SrcR1 = Base.getReg();
435  const unsigned SrcR2 = Index.getReg();
436  if ((SrcR1 == 0 || SrcR1 != DstR) && (SrcR2 == 0 || SrcR2 != DstR))
437  return;
438  if (Scale.getImm() > 1)
439  return;
440  LLVM_DEBUG(dbgs() << "FixLEA: Candidate to replace:"; I->dump(););
441  LLVM_DEBUG(dbgs() << "FixLEA: Replaced by: ";);
442  MachineInstr *NewMI = nullptr;
443  // Make ADD instruction for two registers writing to LEA's destination
444  if (SrcR1 != 0 && SrcR2 != 0) {
445  const MCInstrDesc &ADDrr = TII->get(getADDrrFromLEA(Opcode));
446  const MachineOperand &Src = SrcR1 == DstR ? Index : Base;
447  NewMI =
448  BuildMI(*MFI, I, MI.getDebugLoc(), ADDrr, DstR).addReg(DstR).add(Src);
449  LLVM_DEBUG(NewMI->dump(););
450  }
451  // Make ADD instruction for immediate
452  if (Offset.getImm() != 0) {
453  const MCInstrDesc &ADDri =
454  TII->get(getADDriFromLEA(Opcode, Offset));
455  const MachineOperand &SrcR = SrcR1 == DstR ? Base : Index;
456  NewMI = BuildMI(*MFI, I, MI.getDebugLoc(), ADDri, DstR)
457  .add(SrcR)
458  .addImm(Offset.getImm());
459  LLVM_DEBUG(NewMI->dump(););
460  }
461  if (NewMI) {
462  MFI->erase(I);
463  I = NewMI;
464  }
465 }
466 
467 MachineInstr *
468 FixupLEAPass::processInstrForSlow3OpLEA(MachineInstr &MI,
470 
471  const int LEAOpcode = MI.getOpcode();
472  if (!isLEA(LEAOpcode))
473  return nullptr;
474 
475  const MachineOperand &Dst = MI.getOperand(0);
477  const MachineOperand &Scale = MI.getOperand(1 + X86::AddrScaleAmt);
480  const MachineOperand &Segment = MI.getOperand(1 + X86::AddrSegmentReg);
481 
482  if (!(TII->isThreeOperandsLEA(MI) ||
483  hasInefficientLEABaseReg(Base, Index)) ||
484  !TII->isSafeToClobberEFLAGS(*MFI, MI) ||
485  Segment.getReg() != X86::NoRegister)
486  return nullptr;
487 
488  unsigned int DstR = Dst.getReg();
489  unsigned int BaseR = Base.getReg();
490  unsigned int IndexR = Index.getReg();
491  unsigned SSDstR =
492  (LEAOpcode == X86::LEA64_32r) ? getX86SubSuperRegister(DstR, 64) : DstR;
493  bool IsScale1 = Scale.getImm() == 1;
494  bool IsInefficientBase = isInefficientLEAReg(BaseR);
495  bool IsInefficientIndex = isInefficientLEAReg(IndexR);
496 
497  // Skip these cases since it takes more than 2 instructions
498  // to replace the LEA instruction.
499  if (IsInefficientBase && SSDstR == BaseR && !IsScale1)
500  return nullptr;
501  if (LEAOpcode == X86::LEA64_32r && IsInefficientBase &&
502  (IsInefficientIndex || !IsScale1))
503  return nullptr;
504 
505  const DebugLoc DL = MI.getDebugLoc();
506  const MCInstrDesc &ADDrr = TII->get(getADDrrFromLEA(LEAOpcode));
507  const MCInstrDesc &ADDri = TII->get(getADDriFromLEA(LEAOpcode, Offset));
508 
509  LLVM_DEBUG(dbgs() << "FixLEA: Candidate to replace:"; MI.dump(););
510  LLVM_DEBUG(dbgs() << "FixLEA: Replaced by: ";);
511 
512  // First try to replace LEA with one or two (for the 3-op LEA case)
513  // add instructions:
514  // 1.lea (%base,%index,1), %base => add %index,%base
515  // 2.lea (%base,%index,1), %index => add %base,%index
516  if (IsScale1 && (DstR == BaseR || DstR == IndexR)) {
517  const MachineOperand &Src = DstR == BaseR ? Index : Base;
518  MachineInstr *NewMI =
519  BuildMI(*MFI, MI, DL, ADDrr, DstR).addReg(DstR).add(Src);
520  LLVM_DEBUG(NewMI->dump(););
521  // Create ADD instruction for the Offset in case of 3-Ops LEA.
522  if (hasLEAOffset(Offset)) {
523  NewMI = BuildMI(*MFI, MI, DL, ADDri, DstR).addReg(DstR).add(Offset);
524  LLVM_DEBUG(NewMI->dump(););
525  }
526  return NewMI;
527  }
528  // If the base is inefficient try switching the index and base operands,
529  // otherwise just break the 3-Ops LEA inst into 2-Ops LEA + ADD instruction:
530  // lea offset(%base,%index,scale),%dst =>
531  // lea (%base,%index,scale); add offset,%dst
532  if (!IsInefficientBase || (!IsInefficientIndex && IsScale1)) {
533  MachineInstr *NewMI = BuildMI(*MFI, MI, DL, TII->get(LEAOpcode))
534  .add(Dst)
535  .add(IsInefficientBase ? Index : Base)
536  .add(Scale)
537  .add(IsInefficientBase ? Base : Index)
538  .addImm(0)
539  .add(Segment);
540  LLVM_DEBUG(NewMI->dump(););
541  // Create ADD instruction for the Offset in case of 3-Ops LEA.
542  if (hasLEAOffset(Offset)) {
543  NewMI = BuildMI(*MFI, MI, DL, ADDri, DstR).addReg(DstR).add(Offset);
544  LLVM_DEBUG(NewMI->dump(););
545  }
546  return NewMI;
547  }
548  // Handle the rest of the cases with inefficient base register:
549  assert(SSDstR != BaseR && "SSDstR == BaseR should be handled already!");
550  assert(IsInefficientBase && "efficient base should be handled already!");
551 
552  // lea (%base,%index,1), %dst => mov %base,%dst; add %index,%dst
553  if (IsScale1 && !hasLEAOffset(Offset)) {
554  bool BIK = Base.isKill() && BaseR != IndexR;
555  TII->copyPhysReg(*MFI, MI, DL, DstR, BaseR, BIK);
556  LLVM_DEBUG(MI.getPrevNode()->dump(););
557 
558  MachineInstr *NewMI =
559  BuildMI(*MFI, MI, DL, ADDrr, DstR).addReg(DstR).add(Index);
560  LLVM_DEBUG(NewMI->dump(););
561  return NewMI;
562  }
563  // lea offset(%base,%index,scale), %dst =>
564  // lea offset( ,%index,scale), %dst; add %base,%dst
565  MachineInstr *NewMI = BuildMI(*MFI, MI, DL, TII->get(LEAOpcode))
566  .add(Dst)
567  .addReg(0)
568  .add(Scale)
569  .add(Index)
570  .add(Offset)
571  .add(Segment);
572  LLVM_DEBUG(NewMI->dump(););
573 
574  NewMI = BuildMI(*MFI, MI, DL, ADDrr, DstR).addReg(DstR).add(Base);
575  LLVM_DEBUG(NewMI->dump(););
576  return NewMI;
577 }
578 
579 bool FixupLEAPass::processBasicBlock(MachineFunction &MF,
581  bool IsSlowLEA, bool IsSlow3OpsLEA) {
582  for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) {
583  if (OptIncDec)
584  if (fixupIncDec(I, MFI))
585  continue;
586 
587  if (OptLEA) {
588  if (IsSlowLEA) {
589  processInstructionForSlowLEA(I, MFI);
590  continue;
591  }
592 
593  if (IsSlow3OpsLEA) {
594  if (auto *NewMI = processInstrForSlow3OpLEA(*I, MFI)) {
595  MFI->erase(I);
596  I = NewMI;
597  }
598  continue;
599  }
600 
601  processInstruction(I, MFI);
602  }
603  }
604  return false;
605 }
const MachineInstrBuilder & add(const MachineOperand &MO) const
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
static bool isRegOperand(const MachineOperand &Op)
This class represents lattice values for constants.
Definition: AllocatorList.h:24
static bool isLEASimpleIncOrDec(MachineInstr &LEA)
isLEASimpleIncOrDec - Does this LEA have one these forms: lea reg, 1(reg) lea reg, -1(reg)
const X86InstrInfo * getInstrInfo() const override
Definition: X86Subtarget.h:481
bool slowLEA() const
Definition: X86Subtarget.h:648
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Definition: MachineInstr.h:383
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:164
unsigned getReg() const
getReg - Returns the register number.
unsigned Reg
static bool getPreviousInstr(MachineBasicBlock::iterator &I, MachineFunction::iterator MFI)
getPreviousInstr - Given a reference to an instruction in a basic block, return a reference to the pr...
constexpr bool isInt< 8 >(int64_t x)
Definition: MathExtras.h:303
STATISTIC(NumFunctions, "Total number of functions")
A debug info location.
Definition: DebugLoc.h:34
static bool isLEA(const int Opcode)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
static int getADDrrFromLEA(int LEAOpcode)
static bool hasInefficientLEABaseReg(const MachineOperand &Base, const MachineOperand &Index)
Returns true if this LEA uses base an index registers, and the base register is known to be inefficie...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
Provide an instruction scheduling machine model to CodeGen passes.
const HexagonInstrInfo * TII
unsigned getNumOperands() const
Retuns the total number of operands.
Definition: MachineInstr.h:412
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
Definition: MachineInstr.h:409
bool slow3OpsLEA() const
Definition: X86Subtarget.h:649
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
Definition: MachineInstr.h:406
FunctionPass * createX86FixupLEAs()
Return a pass that selectively replaces certain instructions (like add, sub, inc, dec...
static int getADDriFromLEA(int LEAOpcode, const MachineOperand &Offset)
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
MachineInstrBundleIterator< MachineInstr > iterator
static bool isInefficientLEAReg(unsigned int Reg)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
void initializeFixupLEAPassPass(PassRegistry &)
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:285
unsigned getOperandBias(const MCInstrDesc &Desc)
getOperandBias - compute whether all of the def operands are repeated in the uses and therefore shoul...
Definition: X86BaseInfo.h:658
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool slowIncDec() const
Definition: X86Subtarget.h:650
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:34
#define FIXUPLEA_DESC
Iterator for intrusive lists based on ilist_node.
bool LEAusesAG() const
Definition: X86Subtarget.h:647
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperand class - Representation of each machine instruction operand.
int64_t getImm() const
const Function & getFunction() const
Return the LLVM function that this machine code represents.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:133
unsigned getX86SubSuperRegister(unsigned, unsigned, bool High=false)
Returns the sub or super register of a specific X86 register.
#define FIXUPLEA_NAME
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const override
Emit instructions to copy a pair of physical registers.
MachineFunctionProperties & set(Property P)
Representation of each machine instruction.
Definition: MachineInstr.h:64
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
static bool hasLEAOffset(const MachineOperand &Offset)
#define I(x, y, z)
Definition: MD5.cpp:58
bool optForMinSize() const
Optimize this function for minimum size (-Oz).
Definition: Function.h:595
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
IRTranslator LLVM IR MI
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
AddrSegmentReg - The operand # of the segment in the memory operand.
Definition: X86BaseInfo.h:39
#define LLVM_DEBUG(X)
Definition: Debug.h:123
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:414
Properties which a MachineFunction may have at a given point in time.
int getMemoryOperandNo(uint64_t TSFlags)
getMemoryOperandNo - The function returns the MCInst operand # for the first field of the memory oper...
Definition: X86BaseInfo.h:699