@@ -79,27 +79,6 @@ class FixupLEAPass : public MachineFunctionPass {
79
79
MachineBasicBlock &MBB, bool OptIncDec,
80
80
bool UseLEAForSP) const ;
81
81
82
- // / Look for and transform the sequence
83
- // / lea (reg1, reg2), reg3
84
- // / sub reg3, reg4
85
- // / to
86
- // / sub reg1, reg4
87
- // / sub reg2, reg4
88
- // / It can also optimize the sequence lea/add similarly.
89
- bool optLEAALU (MachineBasicBlock::iterator &I, MachineBasicBlock &MBB) const ;
90
-
91
- // / Step forwards in MBB, looking for an ADD/SUB instruction which uses
92
- // / the dest register of LEA instruction I.
93
- MachineBasicBlock::iterator searchALUInst (MachineBasicBlock::iterator &I,
94
- MachineBasicBlock &MBB) const ;
95
-
96
- // / Check instructions between LeaI and AluI (exclusively).
97
- // / Set BaseIndexDef to true if base or index register from LeaI is defined.
98
- // / Set AluDestRef to true if the dest register of AluI is used or defined.
99
- void checkRegUsage (MachineBasicBlock::iterator &LeaI,
100
- MachineBasicBlock::iterator &AluI, bool &BaseIndexDef,
101
- bool &AluDestRef) const ;
102
-
103
82
// / Determine if an instruction references a machine register
104
83
// / and, if so, whether it reads or writes the register.
105
84
RegUsageState usesRegister (MachineOperand &p, MachineBasicBlock::iterator I);
@@ -359,18 +338,6 @@ static inline unsigned getADDrrFromLEA(unsigned LEAOpcode) {
359
338
}
360
339
}
361
340
362
- static inline unsigned getSUBrrFromLEA (unsigned LEAOpcode) {
363
- switch (LEAOpcode) {
364
- default :
365
- llvm_unreachable (" Unexpected LEA instruction" );
366
- case X86::LEA32r:
367
- case X86::LEA64_32r:
368
- return X86::SUB32rr;
369
- case X86::LEA64r:
370
- return X86::SUB64rr;
371
- }
372
- }
373
-
374
341
static inline unsigned getADDriFromLEA (unsigned LEAOpcode,
375
342
const MachineOperand &Offset) {
376
343
bool IsInt8 = Offset.isImm () && isInt<8 >(Offset.getImm ());
@@ -397,133 +364,6 @@ static inline unsigned getINCDECFromLEA(unsigned LEAOpcode, bool IsINC) {
397
364
}
398
365
}
399
366
400
- MachineBasicBlock::iterator
401
- FixupLEAPass::searchALUInst (MachineBasicBlock::iterator &I,
402
- MachineBasicBlock &MBB) const {
403
- const int InstrDistanceThreshold = 5 ;
404
- int InstrDistance = 1 ;
405
- MachineBasicBlock::iterator CurInst = std::next (I);
406
-
407
- unsigned LEAOpcode = I->getOpcode ();
408
- unsigned AddOpcode = getADDrrFromLEA (LEAOpcode);
409
- unsigned SubOpcode = getSUBrrFromLEA (LEAOpcode);
410
- Register DestReg = I->getOperand (0 ).getReg ();
411
-
412
- while (CurInst != MBB.end ()) {
413
- if (CurInst->isCall () || CurInst->isInlineAsm ())
414
- break ;
415
- if (InstrDistance > InstrDistanceThreshold)
416
- break ;
417
-
418
- // Check if the lea dest register is used in an add/sub instruction only.
419
- for (unsigned I = 0 , E = CurInst->getNumOperands (); I != E; ++I) {
420
- MachineOperand &Opnd = CurInst->getOperand (I);
421
- if (Opnd.isReg () && Opnd.getReg () == DestReg) {
422
- if (Opnd.isDef () || !Opnd.isKill ())
423
- return MachineBasicBlock::iterator ();
424
-
425
- unsigned AluOpcode = CurInst->getOpcode ();
426
- if (AluOpcode != AddOpcode && AluOpcode != SubOpcode)
427
- return MachineBasicBlock::iterator ();
428
-
429
- MachineOperand &Opnd2 = CurInst->getOperand (3 - I);
430
- MachineOperand AluDest = CurInst->getOperand (0 );
431
- if (Opnd2.getReg () != AluDest.getReg ())
432
- return MachineBasicBlock::iterator ();
433
-
434
- return CurInst;
435
- }
436
- }
437
-
438
- InstrDistance++;
439
- ++CurInst;
440
- }
441
- return MachineBasicBlock::iterator ();
442
- }
443
-
444
- void FixupLEAPass::checkRegUsage (MachineBasicBlock::iterator &LeaI,
445
- MachineBasicBlock::iterator &AluI,
446
- bool &BaseIndexDef, bool &AluDestRef) const {
447
- BaseIndexDef = AluDestRef = false ;
448
- Register BaseReg = LeaI->getOperand (1 + X86::AddrBaseReg).getReg ();
449
- Register IndexReg = LeaI->getOperand (1 + X86::AddrIndexReg).getReg ();
450
- Register AluDestReg = AluI->getOperand (0 ).getReg ();
451
-
452
- MachineBasicBlock::iterator CurInst = std::next (LeaI);
453
- while (CurInst != AluI) {
454
- for (unsigned I = 0 , E = CurInst->getNumOperands (); I != E; ++I) {
455
- MachineOperand &Opnd = CurInst->getOperand (I);
456
- if (!Opnd.isReg ())
457
- continue ;
458
- Register Reg = Opnd.getReg ();
459
- if (TRI->regsOverlap (Reg, AluDestReg))
460
- AluDestRef = true ;
461
- if (Opnd.isDef () &&
462
- (TRI->regsOverlap (Reg, BaseReg) || TRI->regsOverlap (Reg, IndexReg))) {
463
- BaseIndexDef = true ;
464
- }
465
- }
466
- ++CurInst;
467
- }
468
- }
469
-
470
- bool FixupLEAPass::optLEAALU (MachineBasicBlock::iterator &I,
471
- MachineBasicBlock &MBB) const {
472
- // Look for an add/sub instruction which uses the result of lea.
473
- MachineBasicBlock::iterator AluI = searchALUInst (I, MBB);
474
- if (AluI == MachineBasicBlock::iterator ())
475
- return false ;
476
-
477
- // Check if there are any related register usage between lea and alu.
478
- bool BaseIndexDef, AluDestRef;
479
- checkRegUsage (I, AluI, BaseIndexDef, AluDestRef);
480
-
481
- MachineBasicBlock::iterator InsertPos = AluI;
482
- if (BaseIndexDef) {
483
- if (AluDestRef)
484
- return false ;
485
- MachineBasicBlock::iterator AfterAluI = std::next (AluI);
486
- if (MBB.computeRegisterLiveness (TRI, X86::EFLAGS, AfterAluI) !=
487
- MachineBasicBlock::LQR_Dead)
488
- return false ;
489
-
490
- InsertPos = I;
491
- }
492
-
493
- // Check if there are same registers.
494
- Register AluDestReg = AluI->getOperand (0 ).getReg ();
495
- Register BaseReg = I->getOperand (1 + X86::AddrBaseReg).getReg ();
496
- Register IndexReg = I->getOperand (1 + X86::AddrIndexReg).getReg ();
497
- if (I->getOpcode () == X86::LEA64_32r) {
498
- BaseReg = TRI->getSubReg (BaseReg, X86::sub_32bit);
499
- IndexReg = TRI->getSubReg (IndexReg, X86::sub_32bit);
500
- }
501
- if (AluDestReg == IndexReg) {
502
- if (BaseReg == IndexReg)
503
- return false ;
504
- std::swap (BaseReg, IndexReg);
505
- }
506
-
507
- // Now it's safe to change instructions.
508
- MachineInstr *NewMI1, *NewMI2;
509
- unsigned NewOpcode = AluI->getOpcode ();
510
- NewMI1 = BuildMI (MBB, InsertPos, AluI->getDebugLoc (), TII->get (NewOpcode),
511
- AluDestReg)
512
- .addReg (AluDestReg)
513
- .addReg (BaseReg);
514
- NewMI2 = BuildMI (MBB, InsertPos, AluI->getDebugLoc (), TII->get (NewOpcode),
515
- AluDestReg)
516
- .addReg (AluDestReg)
517
- .addReg (IndexReg);
518
-
519
- MBB.getParent ()->substituteDebugValuesForInst (*AluI, *NewMI1, 1 );
520
- MBB.getParent ()->substituteDebugValuesForInst (*AluI, *NewMI2, 1 );
521
- MBB.erase (I);
522
- MBB.erase (AluI);
523
- I = NewMI1;
524
- return true ;
525
- }
526
-
527
367
bool FixupLEAPass::optTwoAddrLEA (MachineBasicBlock::iterator &I,
528
368
MachineBasicBlock &MBB, bool OptIncDec,
529
369
bool UseLEAForSP) const {
@@ -558,7 +398,6 @@ bool FixupLEAPass::optTwoAddrLEA(MachineBasicBlock::iterator &I,
558
398
559
399
MachineInstr *NewMI = nullptr ;
560
400
561
- // Case 1.
562
401
// Look for lea(%reg1, %reg2), %reg1 or lea(%reg2, %reg1), %reg1
563
402
// which can be turned into add %reg2, %reg1
564
403
if (BaseReg != 0 && IndexReg != 0 && Disp.getImm () == 0 &&
@@ -578,7 +417,6 @@ bool FixupLEAPass::optTwoAddrLEA(MachineBasicBlock::iterator &I,
578
417
.addReg (BaseReg).addReg (IndexReg);
579
418
}
580
419
} else if (DestReg == BaseReg && IndexReg == 0 ) {
581
- // Case 2.
582
420
// This is an LEA with only a base register and a displacement,
583
421
// We can use ADDri or INC/DEC.
584
422
@@ -609,12 +447,6 @@ bool FixupLEAPass::optTwoAddrLEA(MachineBasicBlock::iterator &I,
609
447
.addReg (BaseReg).addImm (Disp.getImm ());
610
448
}
611
449
}
612
- } else if (BaseReg != 0 && IndexReg != 0 && Disp.getImm () == 0 ) {
613
- // Case 3.
614
- // Look for and transform the sequence
615
- // lea (reg1, reg2), reg3
616
- // sub reg3, reg4
617
- return optLEAALU (I, MBB);
618
450
} else
619
451
return false ;
620
452
0 commit comments