/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/CodeGen/RegisterUsageInfo.cpp
Line | Count | Source |
1 | | //===- RegisterUsageInfo.cpp - Register Usage Information Storage ---------===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | /// |
9 | | /// This pass is required to take advantage of the interprocedural register |
10 | | /// allocation infrastructure. |
11 | | /// |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #include "llvm/CodeGen/RegisterUsageInfo.h" |
15 | | #include "llvm/ADT/SmallVector.h" |
16 | | #include "llvm/CodeGen/MachineOperand.h" |
17 | | #include "llvm/CodeGen/TargetRegisterInfo.h" |
18 | | #include "llvm/CodeGen/TargetSubtargetInfo.h" |
19 | | #include "llvm/IR/Function.h" |
20 | | #include "llvm/IR/Module.h" |
21 | | #include "llvm/Pass.h" |
22 | | #include "llvm/Support/CommandLine.h" |
23 | | #include "llvm/Support/raw_ostream.h" |
24 | | #include "llvm/Target/TargetMachine.h" |
25 | | #include <algorithm> |
26 | | #include <cassert> |
27 | | #include <cstdint> |
28 | | #include <utility> |
29 | | #include <vector> |
30 | | |
31 | | using namespace llvm; |
32 | | |
33 | | static cl::opt<bool> DumpRegUsage( |
34 | | "print-regusage", cl::init(false), cl::Hidden, |
35 | | cl::desc("print register usage details collected for analysis.")); |
36 | | |
37 | | INITIALIZE_PASS(PhysicalRegisterUsageInfo, "reg-usage-info", |
38 | | "Register Usage Information Storage", false, true) |
39 | | |
40 | | char PhysicalRegisterUsageInfo::ID = 0; |
41 | | |
42 | 63 | void PhysicalRegisterUsageInfo::setTargetMachine(const LLVMTargetMachine &TM) { |
43 | 63 | this->TM = &TM; |
44 | 63 | } |
45 | | |
46 | 2.41k | bool PhysicalRegisterUsageInfo::doInitialization(Module &M) { |
47 | 2.41k | RegMasks.grow(M.size()); |
48 | 2.41k | return false; |
49 | 2.41k | } |
50 | | |
51 | 2.40k | bool PhysicalRegisterUsageInfo::doFinalization(Module &M) { |
52 | 2.40k | if (DumpRegUsage) |
53 | 5 | print(errs()); |
54 | 2.40k | |
55 | 2.40k | RegMasks.shrink_and_clear(); |
56 | 2.40k | return false; |
57 | 2.40k | } |
58 | | |
59 | | void PhysicalRegisterUsageInfo::storeUpdateRegUsageInfo( |
60 | 63 | const Function &FP, ArrayRef<uint32_t> RegMask) { |
61 | 63 | RegMasks[&FP] = RegMask; |
62 | 63 | } |
63 | | |
64 | | ArrayRef<uint32_t> |
65 | 478 | PhysicalRegisterUsageInfo::getRegUsageInfo(const Function &FP) { |
66 | 478 | auto It = RegMasks.find(&FP); |
67 | 478 | if (It != RegMasks.end()) |
68 | 82 | return makeArrayRef<uint32_t>(It->second); |
69 | 396 | return ArrayRef<uint32_t>(); |
70 | 396 | } |
71 | | |
72 | 5 | void PhysicalRegisterUsageInfo::print(raw_ostream &OS, const Module *M) const { |
73 | 5 | using FuncPtrRegMaskPair = std::pair<const Function *, std::vector<uint32_t>>; |
74 | 5 | |
75 | 5 | SmallVector<const FuncPtrRegMaskPair *, 64> FPRMPairVector; |
76 | 5 | |
77 | 5 | // Create a vector of pointer to RegMasks entries |
78 | 5 | for (const auto &RegMask : RegMasks) |
79 | 12 | FPRMPairVector.push_back(&RegMask); |
80 | 5 | |
81 | 5 | // sort the vector to print analysis in alphabatic order of function name. |
82 | 5 | llvm::sort( |
83 | 5 | FPRMPairVector, |
84 | 13 | [](const FuncPtrRegMaskPair *A, const FuncPtrRegMaskPair *B) -> bool { |
85 | 13 | return A->first->getName() < B->first->getName(); |
86 | 13 | }); |
87 | 5 | |
88 | 12 | for (const FuncPtrRegMaskPair *FPRMPair : FPRMPairVector) { |
89 | 12 | OS << FPRMPair->first->getName() << " " |
90 | 12 | << "Clobbered Registers: "; |
91 | 12 | const TargetRegisterInfo *TRI |
92 | 12 | = TM->getSubtarget<TargetSubtargetInfo>(*(FPRMPair->first)) |
93 | 12 | .getRegisterInfo(); |
94 | 12 | |
95 | 23.5k | for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg23.5k ) { |
96 | 23.5k | if (MachineOperand::clobbersPhysReg(&(FPRMPair->second[0]), PReg)) |
97 | 472 | OS << printReg(PReg, TRI) << " "; |
98 | 23.5k | } |
99 | 12 | OS << "\n"; |
100 | 12 | } |
101 | 5 | } |