1 | //===- MachineSSAContext.cpp ------------------------------------*- C++ -*-===// |
---|---|
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 | /// \file |
9 | /// |
10 | /// This file defines a specialization of the GenericSSAContext<X> |
11 | /// template class for Machine IR. |
12 | /// |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #include "llvm/CodeGen/MachineSSAContext.h" |
16 | #include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h" |
17 | #include "llvm/CodeGen/MachineBasicBlock.h" |
18 | #include "llvm/CodeGen/MachineFunction.h" |
19 | #include "llvm/CodeGen/MachineInstr.h" |
20 | #include "llvm/CodeGen/MachineRegisterInfo.h" |
21 | #include "llvm/Support/raw_ostream.h" |
22 | |
23 | using namespace llvm; |
24 | |
25 | template <> |
26 | void MachineSSAContext::appendBlockDefs(SmallVectorImpl<Register> &defs, |
27 | const MachineBasicBlock &block) { |
28 | for (auto &instr : block.instrs()) { |
29 | for (auto &op : instr.all_defs()) |
30 | defs.push_back(Elt: op.getReg()); |
31 | } |
32 | } |
33 | |
34 | template <> |
35 | void MachineSSAContext::appendBlockTerms(SmallVectorImpl<MachineInstr *> &terms, |
36 | MachineBasicBlock &block) { |
37 | for (auto &T : block.terminators()) |
38 | terms.push_back(Elt: &T); |
39 | } |
40 | |
41 | template <> |
42 | void MachineSSAContext::appendBlockTerms( |
43 | SmallVectorImpl<const MachineInstr *> &terms, |
44 | const MachineBasicBlock &block) { |
45 | for (auto &T : block.terminators()) |
46 | terms.push_back(Elt: &T); |
47 | } |
48 | |
49 | /// Get the defining block of a value. |
50 | template <> |
51 | const MachineBasicBlock *MachineSSAContext::getDefBlock(Register value) const { |
52 | if (!value) |
53 | return nullptr; |
54 | return F->getRegInfo().getVRegDef(Reg: value)->getParent(); |
55 | } |
56 | |
57 | template <> |
58 | bool MachineSSAContext::isConstantOrUndefValuePhi(const MachineInstr &Phi) { |
59 | return Phi.isConstantValuePHI(); |
60 | } |
61 | |
62 | template <> |
63 | Intrinsic::ID MachineSSAContext::getIntrinsicID(const MachineInstr &MI) { |
64 | if (auto *GI = dyn_cast<GIntrinsic>(Val: &MI)) |
65 | return GI->getIntrinsicID(); |
66 | return Intrinsic::not_intrinsic; |
67 | } |
68 | |
69 | template <> |
70 | Printable MachineSSAContext::print(const MachineBasicBlock *Block) const { |
71 | if (!Block) |
72 | return Printable([](raw_ostream &Out) { Out << "<nullptr>"; }); |
73 | return Printable([Block](raw_ostream &Out) { Block->printName(os&: Out); }); |
74 | } |
75 | |
76 | template <> Printable MachineSSAContext::print(const MachineInstr *I) const { |
77 | return Printable([I](raw_ostream &Out) { I->print(OS&: Out); }); |
78 | } |
79 | |
80 | template <> Printable MachineSSAContext::print(Register Value) const { |
81 | auto *MRI = &F->getRegInfo(); |
82 | return Printable([MRI, Value](raw_ostream &Out) { |
83 | Out << printReg(Reg: Value, TRI: MRI->getTargetRegisterInfo(), SubIdx: 0, MRI); |
84 | |
85 | if (Value) { |
86 | // Try to print the definition. |
87 | if (auto *Instr = MRI->getUniqueVRegDef(Reg: Value)) { |
88 | Out << ": "; |
89 | Instr->print(OS&: Out); |
90 | } |
91 | } |
92 | }); |
93 | } |
94 | |
95 | template <> |
96 | Printable MachineSSAContext::printAsOperand(const MachineBasicBlock *BB) const { |
97 | return Printable([BB](raw_ostream &Out) { BB->printAsOperand(OS&: Out); }); |
98 | } |
99 |