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