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