10bf841acSMarina Yatsina //==- llvm/CodeGen/BreakFalseDeps.cpp - Break False Dependency Fix -*- C++ -*==//
20bf841acSMarina Yatsina //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60bf841acSMarina Yatsina //
70bf841acSMarina Yatsina //===----------------------------------------------------------------------===//
80bf841acSMarina Yatsina //
90bf841acSMarina Yatsina /// \file Break False Dependency pass.
100bf841acSMarina Yatsina ///
110bf841acSMarina Yatsina /// Some instructions have false dependencies which cause unnecessary stalls.
12df6a958dSSanjay Patel /// For example, instructions may write part of a register and implicitly
130bf841acSMarina Yatsina /// need to read the other parts of the register. This may cause unwanted
140bf841acSMarina Yatsina /// stalls preventing otherwise unrelated instructions from executing in
150bf841acSMarina Yatsina /// parallel in an out-of-order CPU.
16df6a958dSSanjay Patel /// This pass is aimed at identifying and avoiding these dependencies.
170bf841acSMarina Yatsina //
180bf841acSMarina Yatsina //===----------------------------------------------------------------------===//
190bf841acSMarina Yatsina 
200bf841acSMarina Yatsina #include "llvm/CodeGen/LivePhysRegs.h"
210bf841acSMarina Yatsina #include "llvm/CodeGen/MachineFunctionPass.h"
220bf841acSMarina Yatsina #include "llvm/CodeGen/ReachingDefAnalysis.h"
230bf841acSMarina Yatsina #include "llvm/CodeGen/RegisterClassInfo.h"
240bf841acSMarina Yatsina #include "llvm/CodeGen/TargetInstrInfo.h"
2505da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
26*01be9be2Sserge-sans-paille #include "llvm/MC/MCInstrDesc.h"
27*01be9be2Sserge-sans-paille #include "llvm/MC/MCRegister.h"
28*01be9be2Sserge-sans-paille #include "llvm/MC/MCRegisterInfo.h"
29904cd3e0SReid Kleckner #include "llvm/Support/Debug.h"
300bf841acSMarina Yatsina 
310bf841acSMarina Yatsina using namespace llvm;
320bf841acSMarina Yatsina 
330bf841acSMarina Yatsina namespace llvm {
340bf841acSMarina Yatsina 
350bf841acSMarina Yatsina class BreakFalseDeps : public MachineFunctionPass {
360bf841acSMarina Yatsina private:
370bf841acSMarina Yatsina   MachineFunction *MF;
380bf841acSMarina Yatsina   const TargetInstrInfo *TII;
390bf841acSMarina Yatsina   const TargetRegisterInfo *TRI;
400bf841acSMarina Yatsina   RegisterClassInfo RegClassInfo;
410bf841acSMarina Yatsina 
420bf841acSMarina Yatsina   /// List of undefined register reads in this block in forward order.
430bf841acSMarina Yatsina   std::vector<std::pair<MachineInstr *, unsigned>> UndefReads;
440bf841acSMarina Yatsina 
450bf841acSMarina Yatsina   /// Storage for register unit liveness.
460bf841acSMarina Yatsina   LivePhysRegs LiveRegSet;
470bf841acSMarina Yatsina 
480bf841acSMarina Yatsina   ReachingDefAnalysis *RDA;
490bf841acSMarina Yatsina 
500bf841acSMarina Yatsina public:
510bf841acSMarina Yatsina   static char ID; // Pass identification, replacement for typeid
520bf841acSMarina Yatsina 
BreakFalseDeps()530bf841acSMarina Yatsina   BreakFalseDeps() : MachineFunctionPass(ID) {
540bf841acSMarina Yatsina     initializeBreakFalseDepsPass(*PassRegistry::getPassRegistry());
550bf841acSMarina Yatsina   }
560bf841acSMarina Yatsina 
getAnalysisUsage(AnalysisUsage & AU) const570bf841acSMarina Yatsina   void getAnalysisUsage(AnalysisUsage &AU) const override {
580bf841acSMarina Yatsina     AU.setPreservesAll();
590bf841acSMarina Yatsina     AU.addRequired<ReachingDefAnalysis>();
600bf841acSMarina Yatsina     MachineFunctionPass::getAnalysisUsage(AU);
610bf841acSMarina Yatsina   }
620bf841acSMarina Yatsina 
630bf841acSMarina Yatsina   bool runOnMachineFunction(MachineFunction &MF) override;
640bf841acSMarina Yatsina 
getRequiredProperties() const650bf841acSMarina Yatsina   MachineFunctionProperties getRequiredProperties() const override {
660bf841acSMarina Yatsina     return MachineFunctionProperties().set(
670bf841acSMarina Yatsina       MachineFunctionProperties::Property::NoVRegs);
680bf841acSMarina Yatsina   }
690bf841acSMarina Yatsina 
700bf841acSMarina Yatsina private:
710bf841acSMarina Yatsina   /// Process he given basic block.
720bf841acSMarina Yatsina   void processBasicBlock(MachineBasicBlock *MBB);
730bf841acSMarina Yatsina 
740bf841acSMarina Yatsina   /// Update def-ages for registers defined by MI.
750bf841acSMarina Yatsina   /// Also break dependencies on partial defs and undef uses.
760bf841acSMarina Yatsina   void processDefs(MachineInstr *MI);
770bf841acSMarina Yatsina 
785f8f34e4SAdrian Prantl   /// Helps avoid false dependencies on undef registers by updating the
790bf841acSMarina Yatsina   /// machine instructions' undef operand to use a register that the instruction
800bf841acSMarina Yatsina   /// is truly dependent on, or use a register with clearance higher than Pref.
810bf841acSMarina Yatsina   /// Returns true if it was able to find a true dependency, thus not requiring
820bf841acSMarina Yatsina   /// a dependency breaking instruction regardless of clearance.
830bf841acSMarina Yatsina   bool pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
840bf841acSMarina Yatsina     unsigned Pref);
850bf841acSMarina Yatsina 
865f8f34e4SAdrian Prantl   /// Return true to if it makes sense to break dependence on a partial
870bf841acSMarina Yatsina   /// def or undef use.
880bf841acSMarina Yatsina   bool shouldBreakDependence(MachineInstr *, unsigned OpIdx, unsigned Pref);
890bf841acSMarina Yatsina 
905f8f34e4SAdrian Prantl   /// Break false dependencies on undefined register reads.
910bf841acSMarina Yatsina   /// Walk the block backward computing precise liveness. This is expensive, so
920bf841acSMarina Yatsina   /// we only do it on demand. Note that the occurrence of undefined register
930bf841acSMarina Yatsina   /// reads that should be broken is very rare, but when they occur we may have
940bf841acSMarina Yatsina   /// many in a single block.
950bf841acSMarina Yatsina   void processUndefReads(MachineBasicBlock *);
960bf841acSMarina Yatsina };
970bf841acSMarina Yatsina 
980bf841acSMarina Yatsina } // namespace llvm
990bf841acSMarina Yatsina 
1000bf841acSMarina Yatsina #define DEBUG_TYPE "break-false-deps"
1010bf841acSMarina Yatsina 
1020bf841acSMarina Yatsina char BreakFalseDeps::ID = 0;
1030bf841acSMarina Yatsina INITIALIZE_PASS_BEGIN(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)1040bf841acSMarina Yatsina INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)
1050bf841acSMarina Yatsina INITIALIZE_PASS_END(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
1060bf841acSMarina Yatsina 
1070bf841acSMarina Yatsina FunctionPass *llvm::createBreakFalseDeps() { return new BreakFalseDeps(); }
1080bf841acSMarina Yatsina 
pickBestRegisterForUndef(MachineInstr * MI,unsigned OpIdx,unsigned Pref)1090bf841acSMarina Yatsina bool BreakFalseDeps::pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
1100bf841acSMarina Yatsina   unsigned Pref) {
11124b3c2d0SCraig Topper 
11224b3c2d0SCraig Topper   // We can't change tied operands.
11324b3c2d0SCraig Topper   if (MI->isRegTiedToDefOperand(OpIdx))
11424b3c2d0SCraig Topper     return false;
11524b3c2d0SCraig Topper 
1160bf841acSMarina Yatsina   MachineOperand &MO = MI->getOperand(OpIdx);
1170bf841acSMarina Yatsina   assert(MO.isUndef() && "Expected undef machine operand");
1180bf841acSMarina Yatsina 
11924b3c2d0SCraig Topper   // We can't change registers that aren't renamable.
12024b3c2d0SCraig Topper   if (!MO.isRenamable())
12124b3c2d0SCraig Topper     return false;
12224b3c2d0SCraig Topper 
123d85b845cSMircea Trofin   MCRegister OriginalReg = MO.getReg().asMCReg();
1240bf841acSMarina Yatsina 
1250bf841acSMarina Yatsina   // Update only undef operands that have reg units that are mapped to one root.
1260bf841acSMarina Yatsina   for (MCRegUnitIterator Unit(OriginalReg, TRI); Unit.isValid(); ++Unit) {
1270bf841acSMarina Yatsina     unsigned NumRoots = 0;
1280bf841acSMarina Yatsina     for (MCRegUnitRootIterator Root(*Unit, TRI); Root.isValid(); ++Root) {
1290bf841acSMarina Yatsina       NumRoots++;
1300bf841acSMarina Yatsina       if (NumRoots > 1)
1310bf841acSMarina Yatsina         return false;
1320bf841acSMarina Yatsina     }
1330bf841acSMarina Yatsina   }
1340bf841acSMarina Yatsina 
1350bf841acSMarina Yatsina   // Get the undef operand's register class
1360bf841acSMarina Yatsina   const TargetRegisterClass *OpRC =
1370bf841acSMarina Yatsina     TII->getRegClass(MI->getDesc(), OpIdx, TRI, *MF);
1380bf841acSMarina Yatsina 
1390bf841acSMarina Yatsina   // If the instruction has a true dependency, we can hide the false depdency
1400bf841acSMarina Yatsina   // behind it.
1410bf841acSMarina Yatsina   for (MachineOperand &CurrMO : MI->operands()) {
1420bf841acSMarina Yatsina     if (!CurrMO.isReg() || CurrMO.isDef() || CurrMO.isUndef() ||
1430bf841acSMarina Yatsina       !OpRC->contains(CurrMO.getReg()))
1440bf841acSMarina Yatsina       continue;
1450bf841acSMarina Yatsina     // We found a true dependency - replace the undef register with the true
1460bf841acSMarina Yatsina     // dependency.
1470bf841acSMarina Yatsina     MO.setReg(CurrMO.getReg());
1480bf841acSMarina Yatsina     return true;
1490bf841acSMarina Yatsina   }
1500bf841acSMarina Yatsina 
1510bf841acSMarina Yatsina   // Go over all registers in the register class and find the register with
1520bf841acSMarina Yatsina   // max clearance or clearance higher than Pref.
1530bf841acSMarina Yatsina   unsigned MaxClearance = 0;
1540bf841acSMarina Yatsina   unsigned MaxClearanceReg = OriginalReg;
1550bf841acSMarina Yatsina   ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(OpRC);
1560bf841acSMarina Yatsina   for (MCPhysReg Reg : Order) {
1570bf841acSMarina Yatsina     unsigned Clearance = RDA->getClearance(MI, Reg);
1580bf841acSMarina Yatsina     if (Clearance <= MaxClearance)
1590bf841acSMarina Yatsina       continue;
1600bf841acSMarina Yatsina     MaxClearance = Clearance;
1610bf841acSMarina Yatsina     MaxClearanceReg = Reg;
1620bf841acSMarina Yatsina 
1630bf841acSMarina Yatsina     if (MaxClearance > Pref)
1640bf841acSMarina Yatsina       break;
1650bf841acSMarina Yatsina   }
1660bf841acSMarina Yatsina 
1670bf841acSMarina Yatsina   // Update the operand if we found a register with better clearance.
1680bf841acSMarina Yatsina   if (MaxClearanceReg != OriginalReg)
1690bf841acSMarina Yatsina     MO.setReg(MaxClearanceReg);
1700bf841acSMarina Yatsina 
1710bf841acSMarina Yatsina   return false;
1720bf841acSMarina Yatsina }
1730bf841acSMarina Yatsina 
shouldBreakDependence(MachineInstr * MI,unsigned OpIdx,unsigned Pref)1740bf841acSMarina Yatsina bool BreakFalseDeps::shouldBreakDependence(MachineInstr *MI, unsigned OpIdx,
1750bf841acSMarina Yatsina                                            unsigned Pref) {
176e24537d4SMircea Trofin   MCRegister Reg = MI->getOperand(OpIdx).getReg().asMCReg();
177e24537d4SMircea Trofin   unsigned Clearance = RDA->getClearance(MI, Reg);
178d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << "Clearance: " << Clearance << ", want " << Pref);
1790bf841acSMarina Yatsina 
1800bf841acSMarina Yatsina   if (Pref > Clearance) {
181d34e60caSNicola Zaghen     LLVM_DEBUG(dbgs() << ": Break dependency.\n");
1820bf841acSMarina Yatsina     return true;
1830bf841acSMarina Yatsina   }
184d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << ": OK .\n");
1850bf841acSMarina Yatsina   return false;
1860bf841acSMarina Yatsina }
1870bf841acSMarina Yatsina 
processDefs(MachineInstr * MI)1880bf841acSMarina Yatsina void BreakFalseDeps::processDefs(MachineInstr *MI) {
189801bf7ebSShiva Chen   assert(!MI->isDebugInstr() && "Won't process debug values");
1900bf841acSMarina Yatsina 
19196dfc783SCraig Topper   const MCInstrDesc &MCID = MI->getDesc();
19296dfc783SCraig Topper 
1930bf841acSMarina Yatsina   // Break dependence on undef uses. Do this before updating LiveRegs below.
19474141519SSanjay Patel   // This can remove a false dependence with no additional instructions.
19596dfc783SCraig Topper   for (unsigned i = MCID.getNumDefs(), e = MCID.getNumOperands(); i != e; ++i) {
19696dfc783SCraig Topper     MachineOperand &MO = MI->getOperand(i);
19796dfc783SCraig Topper     if (!MO.isReg() || !MO.getReg() || !MO.isUse() || !MO.isUndef())
19896dfc783SCraig Topper       continue;
19996dfc783SCraig Topper 
20096dfc783SCraig Topper     unsigned Pref = TII->getUndefRegClearance(*MI, i, TRI);
2010bf841acSMarina Yatsina     if (Pref) {
20296dfc783SCraig Topper       bool HadTrueDependency = pickBestRegisterForUndef(MI, i, Pref);
2030bf841acSMarina Yatsina       // We don't need to bother trying to break a dependency if this
2040bf841acSMarina Yatsina       // instruction has a true dependency on that register through another
2050bf841acSMarina Yatsina       // operand - we'll have to wait for it to be available regardless.
20696dfc783SCraig Topper       if (!HadTrueDependency && shouldBreakDependence(MI, i, Pref))
20796dfc783SCraig Topper         UndefReads.push_back(std::make_pair(MI, i));
20896dfc783SCraig Topper     }
2090bf841acSMarina Yatsina   }
2100bf841acSMarina Yatsina 
21174141519SSanjay Patel   // The code below allows the target to create a new instruction to break the
21274141519SSanjay Patel   // dependence. That opposes the goal of minimizing size, so bail out now.
21374141519SSanjay Patel   if (MF->getFunction().hasMinSize())
21474141519SSanjay Patel     return;
21574141519SSanjay Patel 
2160bf841acSMarina Yatsina   for (unsigned i = 0,
2170bf841acSMarina Yatsina     e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
2180bf841acSMarina Yatsina     i != e; ++i) {
2190bf841acSMarina Yatsina     MachineOperand &MO = MI->getOperand(i);
2200bf841acSMarina Yatsina     if (!MO.isReg() || !MO.getReg())
2210bf841acSMarina Yatsina       continue;
2220bf841acSMarina Yatsina     if (MO.isUse())
2230bf841acSMarina Yatsina       continue;
2240bf841acSMarina Yatsina     // Check clearance before partial register updates.
2250bf841acSMarina Yatsina     unsigned Pref = TII->getPartialRegUpdateClearance(*MI, i, TRI);
2260bf841acSMarina Yatsina     if (Pref && shouldBreakDependence(MI, i, Pref))
2270bf841acSMarina Yatsina       TII->breakPartialRegDependency(*MI, i, TRI);
2280bf841acSMarina Yatsina   }
2290bf841acSMarina Yatsina }
2300bf841acSMarina Yatsina 
processUndefReads(MachineBasicBlock * MBB)2310bf841acSMarina Yatsina void BreakFalseDeps::processUndefReads(MachineBasicBlock *MBB) {
2320bf841acSMarina Yatsina   if (UndefReads.empty())
2330bf841acSMarina Yatsina     return;
2340bf841acSMarina Yatsina 
23574141519SSanjay Patel   // The code below allows the target to create a new instruction to break the
23674141519SSanjay Patel   // dependence. That opposes the goal of minimizing size, so bail out now.
23774141519SSanjay Patel   if (MF->getFunction().hasMinSize())
23874141519SSanjay Patel     return;
23974141519SSanjay Patel 
2400bf841acSMarina Yatsina   // Collect this block's live out register units.
2410bf841acSMarina Yatsina   LiveRegSet.init(*TRI);
2420bf841acSMarina Yatsina   // We do not need to care about pristine registers as they are just preserved
2430bf841acSMarina Yatsina   // but not actually used in the function.
2440bf841acSMarina Yatsina   LiveRegSet.addLiveOutsNoPristines(*MBB);
2450bf841acSMarina Yatsina 
2460bf841acSMarina Yatsina   MachineInstr *UndefMI = UndefReads.back().first;
2470bf841acSMarina Yatsina   unsigned OpIdx = UndefReads.back().second;
2480bf841acSMarina Yatsina 
249843d1edaSKazu Hirata   for (MachineInstr &I : llvm::reverse(*MBB)) {
2500bf841acSMarina Yatsina     // Update liveness, including the current instruction's defs.
2510bf841acSMarina Yatsina     LiveRegSet.stepBackward(I);
2520bf841acSMarina Yatsina 
2530bf841acSMarina Yatsina     if (UndefMI == &I) {
2540bf841acSMarina Yatsina       if (!LiveRegSet.contains(UndefMI->getOperand(OpIdx).getReg()))
2550bf841acSMarina Yatsina         TII->breakPartialRegDependency(*UndefMI, OpIdx, TRI);
2560bf841acSMarina Yatsina 
2570bf841acSMarina Yatsina       UndefReads.pop_back();
2580bf841acSMarina Yatsina       if (UndefReads.empty())
2590bf841acSMarina Yatsina         return;
2600bf841acSMarina Yatsina 
2610bf841acSMarina Yatsina       UndefMI = UndefReads.back().first;
2620bf841acSMarina Yatsina       OpIdx = UndefReads.back().second;
2630bf841acSMarina Yatsina     }
2640bf841acSMarina Yatsina   }
2650bf841acSMarina Yatsina }
2660bf841acSMarina Yatsina 
processBasicBlock(MachineBasicBlock * MBB)2670bf841acSMarina Yatsina void BreakFalseDeps::processBasicBlock(MachineBasicBlock *MBB) {
2680bf841acSMarina Yatsina   UndefReads.clear();
2690bf841acSMarina Yatsina   // If this block is not done, it makes little sense to make any decisions
2700bf841acSMarina Yatsina   // based on clearance information. We need to make a second pass anyway,
2710bf841acSMarina Yatsina   // and by then we'll have better information, so we can avoid doing the work
2720bf841acSMarina Yatsina   // to try and break dependencies now.
2730bf841acSMarina Yatsina   for (MachineInstr &MI : *MBB) {
274801bf7ebSShiva Chen     if (!MI.isDebugInstr())
2750bf841acSMarina Yatsina       processDefs(&MI);
2760bf841acSMarina Yatsina   }
2770bf841acSMarina Yatsina   processUndefReads(MBB);
2780bf841acSMarina Yatsina }
2790bf841acSMarina Yatsina 
runOnMachineFunction(MachineFunction & mf)2800bf841acSMarina Yatsina bool BreakFalseDeps::runOnMachineFunction(MachineFunction &mf) {
2810bf841acSMarina Yatsina   if (skipFunction(mf.getFunction()))
2820bf841acSMarina Yatsina     return false;
2830bf841acSMarina Yatsina   MF = &mf;
2840bf841acSMarina Yatsina   TII = MF->getSubtarget().getInstrInfo();
2850bf841acSMarina Yatsina   TRI = MF->getSubtarget().getRegisterInfo();
2860bf841acSMarina Yatsina   RDA = &getAnalysis<ReachingDefAnalysis>();
2870bf841acSMarina Yatsina 
2880bf841acSMarina Yatsina   RegClassInfo.runOnMachineFunction(mf);
2890bf841acSMarina Yatsina 
290d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << "********** BREAK FALSE DEPENDENCIES **********\n");
2910bf841acSMarina Yatsina 
2920bf841acSMarina Yatsina   // Traverse the basic blocks.
2930bf841acSMarina Yatsina   for (MachineBasicBlock &MBB : mf) {
2940bf841acSMarina Yatsina     processBasicBlock(&MBB);
2950bf841acSMarina Yatsina   }
2960bf841acSMarina Yatsina 
2970bf841acSMarina Yatsina   return false;
2980bf841acSMarina Yatsina }
299