1 //===- SSAContext.cpp -------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
10 /// This file defines a specialization of the GenericSSAContext<X>
11 /// template class for LLVM IR.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/IR/SSAContext.h"
16 #include "llvm/IR/BasicBlock.h"
17 #include "llvm/IR/Function.h"
18 #include "llvm/IR/Instructions.h"
19 #include "llvm/IR/Intrinsics.h"
20 #include "llvm/IR/ModuleSlotTracker.h"
21 #include "llvm/Support/raw_ostream.h"
26 void SSAContext::appendBlockDefs(SmallVectorImpl
<Value
*> &defs
,
28 for (auto &instr
: block
) {
29 if (instr
.isTerminator())
31 defs
.push_back(&instr
);
36 void SSAContext::appendBlockDefs(SmallVectorImpl
<const Value
*> &defs
,
37 const BasicBlock
&block
) {
38 for (auto &instr
: block
) {
39 if (instr
.isTerminator())
41 defs
.push_back(&instr
);
46 void SSAContext::appendBlockTerms(SmallVectorImpl
<Instruction
*> &terms
,
48 terms
.push_back(block
.getTerminator());
52 void SSAContext::appendBlockTerms(SmallVectorImpl
<const Instruction
*> &terms
,
53 const BasicBlock
&block
) {
54 terms
.push_back(block
.getTerminator());
58 const BasicBlock
*SSAContext::getDefBlock(const Value
*value
) const {
59 if (const auto *instruction
= dyn_cast
<Instruction
>(value
))
60 return instruction
->getParent();
65 bool SSAContext::isConstantOrUndefValuePhi(const Instruction
&Instr
) {
66 if (auto *Phi
= dyn_cast
<PHINode
>(&Instr
))
67 return Phi
->hasConstantOrUndefValue();
71 template <> Intrinsic::ID
SSAContext::getIntrinsicID(const Instruction
&I
) {
72 if (auto *CB
= dyn_cast
<CallBase
>(&I
))
73 return CB
->getIntrinsicID();
74 return Intrinsic::not_intrinsic
;
77 template <> Printable
SSAContext::print(const Value
*V
) const {
78 return Printable([V
](raw_ostream
&Out
) { V
->print(Out
); });
81 template <> Printable
SSAContext::print(const Instruction
*Inst
) const {
82 return print(cast
<Value
>(Inst
));
85 template <> Printable
SSAContext::print(const BasicBlock
*BB
) const {
87 return Printable([](raw_ostream
&Out
) { Out
<< "<nullptr>"; });
89 return Printable([BB
](raw_ostream
&Out
) { Out
<< BB
->getName(); });
91 return Printable([BB
](raw_ostream
&Out
) {
92 ModuleSlotTracker MST
{BB
->getParent()->getParent(), false};
93 MST
.incorporateFunction(*BB
->getParent());
94 Out
<< MST
.getLocalSlot(BB
);
98 template <> Printable
SSAContext::printAsOperand(const BasicBlock
*BB
) const {
99 return Printable([BB
](raw_ostream
&Out
) { BB
->printAsOperand(Out
); });