1*9880d681SAndroid Build Coastguard Worker //=--- RegUsageInfoPropagate.cpp - Register Usage Informartion Propagation --=//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker ///
10*9880d681SAndroid Build Coastguard Worker /// This pass is required to take advantage of the interprocedural register
11*9880d681SAndroid Build Coastguard Worker /// allocation infrastructure.
12*9880d681SAndroid Build Coastguard Worker ///
13*9880d681SAndroid Build Coastguard Worker /// This pass iterates through MachineInstrs in a given MachineFunction and at
14*9880d681SAndroid Build Coastguard Worker /// each callsite queries RegisterUsageInfo for RegMask (calculated based on
15*9880d681SAndroid Build Coastguard Worker /// actual register allocation) of the callee function, if the RegMask detail
16*9880d681SAndroid Build Coastguard Worker /// is available then this pass will update the RegMask of the call instruction.
17*9880d681SAndroid Build Coastguard Worker /// This updated RegMask will be used by the register allocator while allocating
18*9880d681SAndroid Build Coastguard Worker /// the current MachineFunction.
19*9880d681SAndroid Build Coastguard Worker ///
20*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineBasicBlock.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunctionPass.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstr.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/RegisterUsageInfo.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/PassAnalysisSupport.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
33*9880d681SAndroid Build Coastguard Worker #include <map>
34*9880d681SAndroid Build Coastguard Worker #include <string>
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker namespace llvm {
37*9880d681SAndroid Build Coastguard Worker void initializeRegUsageInfoPropagationPassPass(PassRegistry &);
38*9880d681SAndroid Build Coastguard Worker }
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker using namespace llvm;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "ip-regalloc"
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker #define RUIP_NAME "Register Usage Information Propagation"
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker namespace {
47*9880d681SAndroid Build Coastguard Worker class RegUsageInfoPropagationPass : public MachineFunctionPass {
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker public:
RegUsageInfoPropagationPass()50*9880d681SAndroid Build Coastguard Worker RegUsageInfoPropagationPass() : MachineFunctionPass(ID) {
51*9880d681SAndroid Build Coastguard Worker PassRegistry &Registry = *PassRegistry::getPassRegistry();
52*9880d681SAndroid Build Coastguard Worker initializeRegUsageInfoPropagationPassPass(Registry);
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker
getPassName() const55*9880d681SAndroid Build Coastguard Worker const char *getPassName() const override { return RUIP_NAME; }
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker bool runOnMachineFunction(MachineFunction &MF) override;
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override;
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker static char ID;
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker private:
setRegMask(MachineInstr & MI,const uint32_t * RegMask)64*9880d681SAndroid Build Coastguard Worker static void setRegMask(MachineInstr &MI, const uint32_t *RegMask) {
65*9880d681SAndroid Build Coastguard Worker for (MachineOperand &MO : MI.operands()) {
66*9880d681SAndroid Build Coastguard Worker if (MO.isRegMask())
67*9880d681SAndroid Build Coastguard Worker MO.setRegMask(RegMask);
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker };
71*9880d681SAndroid Build Coastguard Worker } // end of anonymous namespace
72*9880d681SAndroid Build Coastguard Worker char RegUsageInfoPropagationPass::ID = 0;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_BEGIN(RegUsageInfoPropagationPass, "reg-usage-propagation",
75*9880d681SAndroid Build Coastguard Worker RUIP_NAME, false, false)
INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfo)76*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfo)
77*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_END(RegUsageInfoPropagationPass, "reg-usage-propagation",
78*9880d681SAndroid Build Coastguard Worker RUIP_NAME, false, false)
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker FunctionPass *llvm::createRegUsageInfoPropPass() {
81*9880d681SAndroid Build Coastguard Worker return new RegUsageInfoPropagationPass();
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const84*9880d681SAndroid Build Coastguard Worker void RegUsageInfoPropagationPass::getAnalysisUsage(AnalysisUsage &AU) const {
85*9880d681SAndroid Build Coastguard Worker AU.addRequired<PhysicalRegisterUsageInfo>();
86*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
87*9880d681SAndroid Build Coastguard Worker MachineFunctionPass::getAnalysisUsage(AU);
88*9880d681SAndroid Build Coastguard Worker }
89*9880d681SAndroid Build Coastguard Worker
runOnMachineFunction(MachineFunction & MF)90*9880d681SAndroid Build Coastguard Worker bool RegUsageInfoPropagationPass::runOnMachineFunction(MachineFunction &MF) {
91*9880d681SAndroid Build Coastguard Worker const Module *M = MF.getFunction()->getParent();
92*9880d681SAndroid Build Coastguard Worker PhysicalRegisterUsageInfo *PRUI = &getAnalysis<PhysicalRegisterUsageInfo>();
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " ++++++++++++++++++++ " << getPassName()
95*9880d681SAndroid Build Coastguard Worker << " ++++++++++++++++++++ \n");
96*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "MachineFunction : " << MF.getName() << "\n");
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker bool Changed = false;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker for (MachineBasicBlock &MBB : MF) {
101*9880d681SAndroid Build Coastguard Worker for (MachineInstr &MI : MBB) {
102*9880d681SAndroid Build Coastguard Worker if (!MI.isCall())
103*9880d681SAndroid Build Coastguard Worker continue;
104*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs()
105*9880d681SAndroid Build Coastguard Worker << "Call Instruction Before Register Usage Info Propagation : \n");
106*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << MI << "\n");
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker auto UpdateRegMask = [&](const Function *F) {
109*9880d681SAndroid Build Coastguard Worker const auto *RegMask = PRUI->getRegUsageInfo(F);
110*9880d681SAndroid Build Coastguard Worker if (!RegMask)
111*9880d681SAndroid Build Coastguard Worker return;
112*9880d681SAndroid Build Coastguard Worker setRegMask(MI, &(*RegMask)[0]);
113*9880d681SAndroid Build Coastguard Worker Changed = true;
114*9880d681SAndroid Build Coastguard Worker };
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker MachineOperand &Operand = MI.getOperand(0);
117*9880d681SAndroid Build Coastguard Worker if (Operand.isGlobal())
118*9880d681SAndroid Build Coastguard Worker UpdateRegMask(cast<Function>(Operand.getGlobal()));
119*9880d681SAndroid Build Coastguard Worker else if (Operand.isSymbol())
120*9880d681SAndroid Build Coastguard Worker UpdateRegMask(M->getFunction(Operand.getSymbolName()));
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs()
123*9880d681SAndroid Build Coastguard Worker << "Call Instruction After Register Usage Info Propagation : \n");
124*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << MI << "\n");
125*9880d681SAndroid Build Coastguard Worker }
126*9880d681SAndroid Build Coastguard Worker }
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
129*9880d681SAndroid Build Coastguard Worker "++++++ \n");
130*9880d681SAndroid Build Coastguard Worker return Changed;
131*9880d681SAndroid Build Coastguard Worker }
132