xref: /llvm-project/llvm/lib/CodeGen/BreakFalseDeps.cpp (revision aa2d0fbc30d948dc9ce7d312ae4c56467fa57932)
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 
20aa5cc39bSSerguei Katkov #include "llvm/ADT/DepthFirstIterator.h"
210bf841acSMarina Yatsina #include "llvm/CodeGen/LivePhysRegs.h"
220bf841acSMarina Yatsina #include "llvm/CodeGen/MachineFunctionPass.h"
230bf841acSMarina Yatsina #include "llvm/CodeGen/ReachingDefAnalysis.h"
240bf841acSMarina Yatsina #include "llvm/CodeGen/RegisterClassInfo.h"
250bf841acSMarina Yatsina #include "llvm/CodeGen/TargetInstrInfo.h"
2605da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
2701be9be2Sserge-sans-paille #include "llvm/MC/MCInstrDesc.h"
2801be9be2Sserge-sans-paille #include "llvm/MC/MCRegister.h"
2901be9be2Sserge-sans-paille #include "llvm/MC/MCRegisterInfo.h"
30904cd3e0SReid Kleckner #include "llvm/Support/Debug.h"
310bf841acSMarina Yatsina 
320bf841acSMarina Yatsina using namespace llvm;
330bf841acSMarina Yatsina 
340bf841acSMarina Yatsina namespace llvm {
350bf841acSMarina Yatsina 
360bf841acSMarina Yatsina class BreakFalseDeps : public MachineFunctionPass {
370bf841acSMarina Yatsina private:
388bf7f86dSAkshay Khadse   MachineFunction *MF = nullptr;
398bf7f86dSAkshay Khadse   const TargetInstrInfo *TII = nullptr;
408bf7f86dSAkshay Khadse   const TargetRegisterInfo *TRI = nullptr;
410bf841acSMarina Yatsina   RegisterClassInfo RegClassInfo;
420bf841acSMarina Yatsina 
430bf841acSMarina Yatsina   /// List of undefined register reads in this block in forward order.
440bf841acSMarina Yatsina   std::vector<std::pair<MachineInstr *, unsigned>> UndefReads;
450bf841acSMarina Yatsina 
460bf841acSMarina Yatsina   /// Storage for register unit liveness.
470bf841acSMarina Yatsina   LivePhysRegs LiveRegSet;
480bf841acSMarina Yatsina 
498bf7f86dSAkshay Khadse   ReachingDefAnalysis *RDA = nullptr;
500bf841acSMarina Yatsina 
510bf841acSMarina Yatsina public:
520bf841acSMarina Yatsina   static char ID; // Pass identification, replacement for typeid
530bf841acSMarina Yatsina 
BreakFalseDeps()540bf841acSMarina Yatsina   BreakFalseDeps() : MachineFunctionPass(ID) {
550bf841acSMarina Yatsina     initializeBreakFalseDepsPass(*PassRegistry::getPassRegistry());
560bf841acSMarina Yatsina   }
570bf841acSMarina Yatsina 
getAnalysisUsage(AnalysisUsage & AU) const580bf841acSMarina Yatsina   void getAnalysisUsage(AnalysisUsage &AU) const override {
590bf841acSMarina Yatsina     AU.setPreservesAll();
600bf841acSMarina Yatsina     AU.addRequired<ReachingDefAnalysis>();
610bf841acSMarina Yatsina     MachineFunctionPass::getAnalysisUsage(AU);
620bf841acSMarina Yatsina   }
630bf841acSMarina Yatsina 
640bf841acSMarina Yatsina   bool runOnMachineFunction(MachineFunction &MF) override;
650bf841acSMarina Yatsina 
getRequiredProperties() const660bf841acSMarina Yatsina   MachineFunctionProperties getRequiredProperties() const override {
670bf841acSMarina Yatsina     return MachineFunctionProperties().set(
680bf841acSMarina Yatsina       MachineFunctionProperties::Property::NoVRegs);
690bf841acSMarina Yatsina   }
700bf841acSMarina Yatsina 
710bf841acSMarina Yatsina private:
720bf841acSMarina Yatsina   /// Process he given basic block.
730bf841acSMarina Yatsina   void processBasicBlock(MachineBasicBlock *MBB);
740bf841acSMarina Yatsina 
750bf841acSMarina Yatsina   /// Update def-ages for registers defined by MI.
760bf841acSMarina Yatsina   /// Also break dependencies on partial defs and undef uses.
770bf841acSMarina Yatsina   void processDefs(MachineInstr *MI);
780bf841acSMarina Yatsina 
795f8f34e4SAdrian Prantl   /// Helps avoid false dependencies on undef registers by updating the
800bf841acSMarina Yatsina   /// machine instructions' undef operand to use a register that the instruction
810bf841acSMarina Yatsina   /// is truly dependent on, or use a register with clearance higher than Pref.
820bf841acSMarina Yatsina   /// Returns true if it was able to find a true dependency, thus not requiring
830bf841acSMarina Yatsina   /// a dependency breaking instruction regardless of clearance.
840bf841acSMarina Yatsina   bool pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
850bf841acSMarina Yatsina     unsigned Pref);
860bf841acSMarina Yatsina 
875f8f34e4SAdrian Prantl   /// Return true to if it makes sense to break dependence on a partial
880bf841acSMarina Yatsina   /// def or undef use.
890bf841acSMarina Yatsina   bool shouldBreakDependence(MachineInstr *, unsigned OpIdx, unsigned Pref);
900bf841acSMarina Yatsina 
915f8f34e4SAdrian Prantl   /// Break false dependencies on undefined register reads.
920bf841acSMarina Yatsina   /// Walk the block backward computing precise liveness. This is expensive, so
930bf841acSMarina Yatsina   /// we only do it on demand. Note that the occurrence of undefined register
940bf841acSMarina Yatsina   /// reads that should be broken is very rare, but when they occur we may have
950bf841acSMarina Yatsina   /// many in a single block.
960bf841acSMarina Yatsina   void processUndefReads(MachineBasicBlock *);
970bf841acSMarina Yatsina };
980bf841acSMarina Yatsina 
990bf841acSMarina Yatsina } // namespace llvm
1000bf841acSMarina Yatsina 
1010bf841acSMarina Yatsina #define DEBUG_TYPE "break-false-deps"
1020bf841acSMarina Yatsina 
1030bf841acSMarina Yatsina char BreakFalseDeps::ID = 0;
1040bf841acSMarina Yatsina INITIALIZE_PASS_BEGIN(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)1050bf841acSMarina Yatsina INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)
1060bf841acSMarina Yatsina INITIALIZE_PASS_END(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
1070bf841acSMarina Yatsina 
1080bf841acSMarina Yatsina FunctionPass *llvm::createBreakFalseDeps() { return new BreakFalseDeps(); }
1090bf841acSMarina Yatsina 
pickBestRegisterForUndef(MachineInstr * MI,unsigned OpIdx,unsigned Pref)1100bf841acSMarina Yatsina bool BreakFalseDeps::pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
1110bf841acSMarina Yatsina   unsigned Pref) {
11224b3c2d0SCraig Topper 
11324b3c2d0SCraig Topper   // We can't change tied operands.
11424b3c2d0SCraig Topper   if (MI->isRegTiedToDefOperand(OpIdx))
11524b3c2d0SCraig Topper     return false;
11624b3c2d0SCraig Topper 
1170bf841acSMarina Yatsina   MachineOperand &MO = MI->getOperand(OpIdx);
1180bf841acSMarina Yatsina   assert(MO.isUndef() && "Expected undef machine operand");
1190bf841acSMarina Yatsina 
12024b3c2d0SCraig Topper   // We can't change registers that aren't renamable.
12124b3c2d0SCraig Topper   if (!MO.isRenamable())
12224b3c2d0SCraig Topper     return false;
12324b3c2d0SCraig Topper 
124d85b845cSMircea Trofin   MCRegister OriginalReg = MO.getReg().asMCReg();
1250bf841acSMarina Yatsina 
1260bf841acSMarina Yatsina   // Update only undef operands that have reg units that are mapped to one root.
127*aa2d0fbcSSergei Barannikov   for (MCRegUnit Unit : TRI->regunits(OriginalReg)) {
1280bf841acSMarina Yatsina     unsigned NumRoots = 0;
129*aa2d0fbcSSergei Barannikov     for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
1300bf841acSMarina Yatsina       NumRoots++;
1310bf841acSMarina Yatsina       if (NumRoots > 1)
1320bf841acSMarina Yatsina         return false;
1330bf841acSMarina Yatsina     }
1340bf841acSMarina Yatsina   }
1350bf841acSMarina Yatsina 
1360bf841acSMarina Yatsina   // Get the undef operand's register class
1370bf841acSMarina Yatsina   const TargetRegisterClass *OpRC =
1380bf841acSMarina Yatsina     TII->getRegClass(MI->getDesc(), OpIdx, TRI, *MF);
1397168e501SPhoebe Wang   assert(OpRC && "Not a valid register class");
1400bf841acSMarina Yatsina 
1410bf841acSMarina Yatsina   // If the instruction has a true dependency, we can hide the false depdency
1420bf841acSMarina Yatsina   // behind it.
1435022fc2aSJay Foad   for (MachineOperand &CurrMO : MI->all_uses()) {
1445022fc2aSJay Foad     if (CurrMO.isUndef() || !OpRC->contains(CurrMO.getReg()))
1450bf841acSMarina Yatsina       continue;
1460bf841acSMarina Yatsina     // We found a true dependency - replace the undef register with the true
1470bf841acSMarina Yatsina     // dependency.
1480bf841acSMarina Yatsina     MO.setReg(CurrMO.getReg());
1490bf841acSMarina Yatsina     return true;
1500bf841acSMarina Yatsina   }
1510bf841acSMarina Yatsina 
1520bf841acSMarina Yatsina   // Go over all registers in the register class and find the register with
1530bf841acSMarina Yatsina   // max clearance or clearance higher than Pref.
1540bf841acSMarina Yatsina   unsigned MaxClearance = 0;
1550bf841acSMarina Yatsina   unsigned MaxClearanceReg = OriginalReg;
1560bf841acSMarina Yatsina   ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(OpRC);
1570bf841acSMarina Yatsina   for (MCPhysReg Reg : Order) {
1580bf841acSMarina Yatsina     unsigned Clearance = RDA->getClearance(MI, Reg);
1590bf841acSMarina Yatsina     if (Clearance <= MaxClearance)
1600bf841acSMarina Yatsina       continue;
1610bf841acSMarina Yatsina     MaxClearance = Clearance;
1620bf841acSMarina Yatsina     MaxClearanceReg = Reg;
1630bf841acSMarina Yatsina 
1640bf841acSMarina Yatsina     if (MaxClearance > Pref)
1650bf841acSMarina Yatsina       break;
1660bf841acSMarina Yatsina   }
1670bf841acSMarina Yatsina 
1680bf841acSMarina Yatsina   // Update the operand if we found a register with better clearance.
1690bf841acSMarina Yatsina   if (MaxClearanceReg != OriginalReg)
1700bf841acSMarina Yatsina     MO.setReg(MaxClearanceReg);
1710bf841acSMarina Yatsina 
1720bf841acSMarina Yatsina   return false;
1730bf841acSMarina Yatsina }
1740bf841acSMarina Yatsina 
shouldBreakDependence(MachineInstr * MI,unsigned OpIdx,unsigned Pref)1750bf841acSMarina Yatsina bool BreakFalseDeps::shouldBreakDependence(MachineInstr *MI, unsigned OpIdx,
1760bf841acSMarina Yatsina                                            unsigned Pref) {
177e24537d4SMircea Trofin   MCRegister Reg = MI->getOperand(OpIdx).getReg().asMCReg();
178e24537d4SMircea Trofin   unsigned Clearance = RDA->getClearance(MI, Reg);
179d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << "Clearance: " << Clearance << ", want " << Pref);
1800bf841acSMarina Yatsina 
1810bf841acSMarina Yatsina   if (Pref > Clearance) {
182d34e60caSNicola Zaghen     LLVM_DEBUG(dbgs() << ": Break dependency.\n");
1830bf841acSMarina Yatsina     return true;
1840bf841acSMarina Yatsina   }
185d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << ": OK .\n");
1860bf841acSMarina Yatsina   return false;
1870bf841acSMarina Yatsina }
1880bf841acSMarina Yatsina 
processDefs(MachineInstr * MI)1890bf841acSMarina Yatsina void BreakFalseDeps::processDefs(MachineInstr *MI) {
190801bf7ebSShiva Chen   assert(!MI->isDebugInstr() && "Won't process debug values");
1910bf841acSMarina Yatsina 
19296dfc783SCraig Topper   const MCInstrDesc &MCID = MI->getDesc();
19396dfc783SCraig Topper 
1940bf841acSMarina Yatsina   // Break dependence on undef uses. Do this before updating LiveRegs below.
19574141519SSanjay Patel   // This can remove a false dependence with no additional instructions.
19696dfc783SCraig Topper   for (unsigned i = MCID.getNumDefs(), e = MCID.getNumOperands(); i != e; ++i) {
19796dfc783SCraig Topper     MachineOperand &MO = MI->getOperand(i);
19896dfc783SCraig Topper     if (!MO.isReg() || !MO.getReg() || !MO.isUse() || !MO.isUndef())
19996dfc783SCraig Topper       continue;
20096dfc783SCraig Topper 
20196dfc783SCraig Topper     unsigned Pref = TII->getUndefRegClearance(*MI, i, TRI);
2020bf841acSMarina Yatsina     if (Pref) {
20396dfc783SCraig Topper       bool HadTrueDependency = pickBestRegisterForUndef(MI, i, Pref);
2040bf841acSMarina Yatsina       // We don't need to bother trying to break a dependency if this
2050bf841acSMarina Yatsina       // instruction has a true dependency on that register through another
2060bf841acSMarina Yatsina       // operand - we'll have to wait for it to be available regardless.
20796dfc783SCraig Topper       if (!HadTrueDependency && shouldBreakDependence(MI, i, Pref))
20896dfc783SCraig Topper         UndefReads.push_back(std::make_pair(MI, i));
20996dfc783SCraig Topper     }
2100bf841acSMarina Yatsina   }
2110bf841acSMarina Yatsina 
21274141519SSanjay Patel   // The code below allows the target to create a new instruction to break the
21374141519SSanjay Patel   // dependence. That opposes the goal of minimizing size, so bail out now.
21474141519SSanjay Patel   if (MF->getFunction().hasMinSize())
21574141519SSanjay Patel     return;
21674141519SSanjay Patel 
2170bf841acSMarina Yatsina   for (unsigned i = 0,
2180bf841acSMarina Yatsina     e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
2190bf841acSMarina Yatsina     i != e; ++i) {
2200bf841acSMarina Yatsina     MachineOperand &MO = MI->getOperand(i);
2210bf841acSMarina Yatsina     if (!MO.isReg() || !MO.getReg())
2220bf841acSMarina Yatsina       continue;
2230bf841acSMarina Yatsina     if (MO.isUse())
2240bf841acSMarina Yatsina       continue;
2250bf841acSMarina Yatsina     // Check clearance before partial register updates.
2260bf841acSMarina Yatsina     unsigned Pref = TII->getPartialRegUpdateClearance(*MI, i, TRI);
2270bf841acSMarina Yatsina     if (Pref && shouldBreakDependence(MI, i, Pref))
2280bf841acSMarina Yatsina       TII->breakPartialRegDependency(*MI, i, TRI);
2290bf841acSMarina Yatsina   }
2300bf841acSMarina Yatsina }
2310bf841acSMarina Yatsina 
processUndefReads(MachineBasicBlock * MBB)2320bf841acSMarina Yatsina void BreakFalseDeps::processUndefReads(MachineBasicBlock *MBB) {
2330bf841acSMarina Yatsina   if (UndefReads.empty())
2340bf841acSMarina Yatsina     return;
2350bf841acSMarina Yatsina 
23674141519SSanjay Patel   // The code below allows the target to create a new instruction to break the
23774141519SSanjay Patel   // dependence. That opposes the goal of minimizing size, so bail out now.
23874141519SSanjay Patel   if (MF->getFunction().hasMinSize())
23974141519SSanjay Patel     return;
24074141519SSanjay Patel 
2410bf841acSMarina Yatsina   // Collect this block's live out register units.
2420bf841acSMarina Yatsina   LiveRegSet.init(*TRI);
2430bf841acSMarina Yatsina   // We do not need to care about pristine registers as they are just preserved
2440bf841acSMarina Yatsina   // but not actually used in the function.
2450bf841acSMarina Yatsina   LiveRegSet.addLiveOutsNoPristines(*MBB);
2460bf841acSMarina Yatsina 
2470bf841acSMarina Yatsina   MachineInstr *UndefMI = UndefReads.back().first;
2480bf841acSMarina Yatsina   unsigned OpIdx = UndefReads.back().second;
2490bf841acSMarina Yatsina 
250843d1edaSKazu Hirata   for (MachineInstr &I : llvm::reverse(*MBB)) {
2510bf841acSMarina Yatsina     // Update liveness, including the current instruction's defs.
2520bf841acSMarina Yatsina     LiveRegSet.stepBackward(I);
2530bf841acSMarina Yatsina 
2540bf841acSMarina Yatsina     if (UndefMI == &I) {
2550bf841acSMarina Yatsina       if (!LiveRegSet.contains(UndefMI->getOperand(OpIdx).getReg()))
2560bf841acSMarina Yatsina         TII->breakPartialRegDependency(*UndefMI, OpIdx, TRI);
2570bf841acSMarina Yatsina 
2580bf841acSMarina Yatsina       UndefReads.pop_back();
2590bf841acSMarina Yatsina       if (UndefReads.empty())
2600bf841acSMarina Yatsina         return;
2610bf841acSMarina Yatsina 
2620bf841acSMarina Yatsina       UndefMI = UndefReads.back().first;
2630bf841acSMarina Yatsina       OpIdx = UndefReads.back().second;
2640bf841acSMarina Yatsina     }
2650bf841acSMarina Yatsina   }
2660bf841acSMarina Yatsina }
2670bf841acSMarina Yatsina 
processBasicBlock(MachineBasicBlock * MBB)2680bf841acSMarina Yatsina void BreakFalseDeps::processBasicBlock(MachineBasicBlock *MBB) {
2690bf841acSMarina Yatsina   UndefReads.clear();
2700bf841acSMarina Yatsina   // If this block is not done, it makes little sense to make any decisions
2710bf841acSMarina Yatsina   // based on clearance information. We need to make a second pass anyway,
2720bf841acSMarina Yatsina   // and by then we'll have better information, so we can avoid doing the work
2730bf841acSMarina Yatsina   // to try and break dependencies now.
2740bf841acSMarina Yatsina   for (MachineInstr &MI : *MBB) {
275801bf7ebSShiva Chen     if (!MI.isDebugInstr())
2760bf841acSMarina Yatsina       processDefs(&MI);
2770bf841acSMarina Yatsina   }
2780bf841acSMarina Yatsina   processUndefReads(MBB);
2790bf841acSMarina Yatsina }
2800bf841acSMarina Yatsina 
runOnMachineFunction(MachineFunction & mf)2810bf841acSMarina Yatsina bool BreakFalseDeps::runOnMachineFunction(MachineFunction &mf) {
2820bf841acSMarina Yatsina   if (skipFunction(mf.getFunction()))
2830bf841acSMarina Yatsina     return false;
2840bf841acSMarina Yatsina   MF = &mf;
2850bf841acSMarina Yatsina   TII = MF->getSubtarget().getInstrInfo();
2860bf841acSMarina Yatsina   TRI = MF->getSubtarget().getRegisterInfo();
2870bf841acSMarina Yatsina   RDA = &getAnalysis<ReachingDefAnalysis>();
2880bf841acSMarina Yatsina 
2890bf841acSMarina Yatsina   RegClassInfo.runOnMachineFunction(mf);
2900bf841acSMarina Yatsina 
291d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << "********** BREAK FALSE DEPENDENCIES **********\n");
2920bf841acSMarina Yatsina 
293aa5cc39bSSerguei Katkov   // Skip Dead blocks due to ReachingDefAnalysis has no idea about instructions
294aa5cc39bSSerguei Katkov   // in them.
295aa5cc39bSSerguei Katkov   df_iterator_default_set<MachineBasicBlock *> Reachable;
296aa5cc39bSSerguei Katkov   for (MachineBasicBlock *MBB : depth_first_ext(&mf, Reachable))
297aa5cc39bSSerguei Katkov     (void)MBB /* Mark all reachable blocks */;
298aa5cc39bSSerguei Katkov 
2990bf841acSMarina Yatsina   // Traverse the basic blocks.
300aa5cc39bSSerguei Katkov   for (MachineBasicBlock &MBB : mf)
301aa5cc39bSSerguei Katkov     if (Reachable.count(&MBB))
3020bf841acSMarina Yatsina       processBasicBlock(&MBB);
3030bf841acSMarina Yatsina 
3040bf841acSMarina Yatsina   return false;
3050bf841acSMarina Yatsina }
306