1f22ef01cSRoman Divacky //===- MachineSSAUpdater.cpp - Unstructured SSA Update Tool ---------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements the MachineSSAUpdater class. It's based on SSAUpdater
11f22ef01cSRoman Divacky // class in lib/Transforms/Utils.
12f22ef01cSRoman Divacky //
13f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
14f22ef01cSRoman Divacky
15f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineSSAUpdater.h"
16139f7f9bSDimitry Andric #include "llvm/ADT/DenseMap.h"
17139f7f9bSDimitry Andric #include "llvm/ADT/SmallVector.h"
182cab237bSDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
192cab237bSDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
20f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineInstr.h"
21f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineInstrBuilder.h"
222cab237bSDimitry Andric #include "llvm/CodeGen/MachineOperand.h"
23f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineRegisterInfo.h"
242cab237bSDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h"
252cab237bSDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
262cab237bSDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
272cab237bSDimitry Andric #include "llvm/IR/DebugLoc.h"
28f22ef01cSRoman Divacky #include "llvm/Support/Debug.h"
29f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h"
30f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
31f22ef01cSRoman Divacky #include "llvm/Transforms/Utils/SSAUpdaterImpl.h"
322cab237bSDimitry Andric #include <utility>
332cab237bSDimitry Andric
34f22ef01cSRoman Divacky using namespace llvm;
35f22ef01cSRoman Divacky
3691bc56edSDimitry Andric #define DEBUG_TYPE "machine-ssaupdater"
3791bc56edSDimitry Andric
382cab237bSDimitry Andric using AvailableValsTy = DenseMap<MachineBasicBlock *, unsigned>;
392cab237bSDimitry Andric
getAvailableVals(void * AV)40f22ef01cSRoman Divacky static AvailableValsTy &getAvailableVals(void *AV) {
41f22ef01cSRoman Divacky return *static_cast<AvailableValsTy*>(AV);
42f22ef01cSRoman Divacky }
43f22ef01cSRoman Divacky
MachineSSAUpdater(MachineFunction & MF,SmallVectorImpl<MachineInstr * > * NewPHI)44f22ef01cSRoman Divacky MachineSSAUpdater::MachineSSAUpdater(MachineFunction &MF,
45f22ef01cSRoman Divacky SmallVectorImpl<MachineInstr*> *NewPHI)
462cab237bSDimitry Andric : InsertedPHIs(NewPHI), TII(MF.getSubtarget().getInstrInfo()),
472cab237bSDimitry Andric MRI(&MF.getRegInfo()) {}
48f22ef01cSRoman Divacky
~MachineSSAUpdater()49f22ef01cSRoman Divacky MachineSSAUpdater::~MachineSSAUpdater() {
507ae0e2c9SDimitry Andric delete static_cast<AvailableValsTy*>(AV);
51f22ef01cSRoman Divacky }
52f22ef01cSRoman Divacky
53f22ef01cSRoman Divacky /// Initialize - Reset this object to get ready for a new set of SSA
54f22ef01cSRoman Divacky /// updates. ProtoValue is the value used to name PHI nodes.
Initialize(unsigned V)55f22ef01cSRoman Divacky void MachineSSAUpdater::Initialize(unsigned V) {
5691bc56edSDimitry Andric if (!AV)
57f22ef01cSRoman Divacky AV = new AvailableValsTy();
58f22ef01cSRoman Divacky else
59f22ef01cSRoman Divacky getAvailableVals(AV).clear();
60f22ef01cSRoman Divacky
61f22ef01cSRoman Divacky VR = V;
62f22ef01cSRoman Divacky VRC = MRI->getRegClass(VR);
63f22ef01cSRoman Divacky }
64f22ef01cSRoman Divacky
65f22ef01cSRoman Divacky /// HasValueForBlock - Return true if the MachineSSAUpdater already has a value for
66f22ef01cSRoman Divacky /// the specified block.
HasValueForBlock(MachineBasicBlock * BB) const67f22ef01cSRoman Divacky bool MachineSSAUpdater::HasValueForBlock(MachineBasicBlock *BB) const {
68f22ef01cSRoman Divacky return getAvailableVals(AV).count(BB);
69f22ef01cSRoman Divacky }
70f22ef01cSRoman Divacky
71f22ef01cSRoman Divacky /// AddAvailableValue - Indicate that a rewritten value is available in the
72f22ef01cSRoman Divacky /// specified block with the specified value.
AddAvailableValue(MachineBasicBlock * BB,unsigned V)73f22ef01cSRoman Divacky void MachineSSAUpdater::AddAvailableValue(MachineBasicBlock *BB, unsigned V) {
74f22ef01cSRoman Divacky getAvailableVals(AV)[BB] = V;
75f22ef01cSRoman Divacky }
76f22ef01cSRoman Divacky
77f22ef01cSRoman Divacky /// GetValueAtEndOfBlock - Construct SSA form, materializing a value that is
78f22ef01cSRoman Divacky /// live at the end of the specified block.
GetValueAtEndOfBlock(MachineBasicBlock * BB)79f22ef01cSRoman Divacky unsigned MachineSSAUpdater::GetValueAtEndOfBlock(MachineBasicBlock *BB) {
80f22ef01cSRoman Divacky return GetValueAtEndOfBlockInternal(BB);
81f22ef01cSRoman Divacky }
82f22ef01cSRoman Divacky
83f22ef01cSRoman Divacky static
LookForIdenticalPHI(MachineBasicBlock * BB,SmallVectorImpl<std::pair<MachineBasicBlock *,unsigned>> & PredValues)84f22ef01cSRoman Divacky unsigned LookForIdenticalPHI(MachineBasicBlock *BB,
85f785676fSDimitry Andric SmallVectorImpl<std::pair<MachineBasicBlock *, unsigned>> &PredValues) {
86f22ef01cSRoman Divacky if (BB->empty())
87f22ef01cSRoman Divacky return 0;
88f22ef01cSRoman Divacky
89dff0c46cSDimitry Andric MachineBasicBlock::iterator I = BB->begin();
90f22ef01cSRoman Divacky if (!I->isPHI())
91f22ef01cSRoman Divacky return 0;
92f22ef01cSRoman Divacky
93f22ef01cSRoman Divacky AvailableValsTy AVals;
94f22ef01cSRoman Divacky for (unsigned i = 0, e = PredValues.size(); i != e; ++i)
95f22ef01cSRoman Divacky AVals[PredValues[i].first] = PredValues[i].second;
96f22ef01cSRoman Divacky while (I != BB->end() && I->isPHI()) {
97f22ef01cSRoman Divacky bool Same = true;
98f22ef01cSRoman Divacky for (unsigned i = 1, e = I->getNumOperands(); i != e; i += 2) {
99f22ef01cSRoman Divacky unsigned SrcReg = I->getOperand(i).getReg();
100f22ef01cSRoman Divacky MachineBasicBlock *SrcBB = I->getOperand(i+1).getMBB();
101f22ef01cSRoman Divacky if (AVals[SrcBB] != SrcReg) {
102f22ef01cSRoman Divacky Same = false;
103f22ef01cSRoman Divacky break;
104f22ef01cSRoman Divacky }
105f22ef01cSRoman Divacky }
106f22ef01cSRoman Divacky if (Same)
107f22ef01cSRoman Divacky return I->getOperand(0).getReg();
108f22ef01cSRoman Divacky ++I;
109f22ef01cSRoman Divacky }
110f22ef01cSRoman Divacky return 0;
111f22ef01cSRoman Divacky }
112f22ef01cSRoman Divacky
113f22ef01cSRoman Divacky /// InsertNewDef - Insert an empty PHI or IMPLICIT_DEF instruction which define
114f22ef01cSRoman Divacky /// a value of the given register class at the start of the specified basic
115f22ef01cSRoman Divacky /// block. It returns the virtual register defined by the instruction.
116f22ef01cSRoman Divacky static
InsertNewDef(unsigned Opcode,MachineBasicBlock * BB,MachineBasicBlock::iterator I,const TargetRegisterClass * RC,MachineRegisterInfo * MRI,const TargetInstrInfo * TII)117139f7f9bSDimitry Andric MachineInstrBuilder InsertNewDef(unsigned Opcode,
118f22ef01cSRoman Divacky MachineBasicBlock *BB, MachineBasicBlock::iterator I,
119f22ef01cSRoman Divacky const TargetRegisterClass *RC,
120f22ef01cSRoman Divacky MachineRegisterInfo *MRI,
121f22ef01cSRoman Divacky const TargetInstrInfo *TII) {
122f22ef01cSRoman Divacky unsigned NewVR = MRI->createVirtualRegister(RC);
123f22ef01cSRoman Divacky return BuildMI(*BB, I, DebugLoc(), TII->get(Opcode), NewVR);
124f22ef01cSRoman Divacky }
125f22ef01cSRoman Divacky
126f22ef01cSRoman Divacky /// GetValueInMiddleOfBlock - Construct SSA form, materializing a value that
127f22ef01cSRoman Divacky /// is live in the middle of the specified block.
128f22ef01cSRoman Divacky ///
129f22ef01cSRoman Divacky /// GetValueInMiddleOfBlock is the same as GetValueAtEndOfBlock except in one
130f22ef01cSRoman Divacky /// important case: if there is a definition of the rewritten value after the
131f22ef01cSRoman Divacky /// 'use' in BB. Consider code like this:
132f22ef01cSRoman Divacky ///
133f22ef01cSRoman Divacky /// X1 = ...
134f22ef01cSRoman Divacky /// SomeBB:
135f22ef01cSRoman Divacky /// use(X)
136f22ef01cSRoman Divacky /// X2 = ...
137f22ef01cSRoman Divacky /// br Cond, SomeBB, OutBB
138f22ef01cSRoman Divacky ///
139f22ef01cSRoman Divacky /// In this case, there are two values (X1 and X2) added to the AvailableVals
140f22ef01cSRoman Divacky /// set by the client of the rewriter, and those values are both live out of
141f22ef01cSRoman Divacky /// their respective blocks. However, the use of X happens in the *middle* of
142f22ef01cSRoman Divacky /// a block. Because of this, we need to insert a new PHI node in SomeBB to
143f22ef01cSRoman Divacky /// merge the appropriate values, and this value isn't live out of the block.
GetValueInMiddleOfBlock(MachineBasicBlock * BB)144f22ef01cSRoman Divacky unsigned MachineSSAUpdater::GetValueInMiddleOfBlock(MachineBasicBlock *BB) {
145f22ef01cSRoman Divacky // If there is no definition of the renamed variable in this block, just use
146f22ef01cSRoman Divacky // GetValueAtEndOfBlock to do our work.
147f22ef01cSRoman Divacky if (!HasValueForBlock(BB))
148f22ef01cSRoman Divacky return GetValueAtEndOfBlockInternal(BB);
149f22ef01cSRoman Divacky
150f22ef01cSRoman Divacky // If there are no predecessors, just return undef.
151f22ef01cSRoman Divacky if (BB->pred_empty()) {
152f22ef01cSRoman Divacky // Insert an implicit_def to represent an undef value.
153f22ef01cSRoman Divacky MachineInstr *NewDef = InsertNewDef(TargetOpcode::IMPLICIT_DEF,
154f22ef01cSRoman Divacky BB, BB->getFirstTerminator(),
155f22ef01cSRoman Divacky VRC, MRI, TII);
156f22ef01cSRoman Divacky return NewDef->getOperand(0).getReg();
157f22ef01cSRoman Divacky }
158f22ef01cSRoman Divacky
159f22ef01cSRoman Divacky // Otherwise, we have the hard case. Get the live-in values for each
160f22ef01cSRoman Divacky // predecessor.
161f22ef01cSRoman Divacky SmallVector<std::pair<MachineBasicBlock*, unsigned>, 8> PredValues;
162f22ef01cSRoman Divacky unsigned SingularValue = 0;
163f22ef01cSRoman Divacky
164f22ef01cSRoman Divacky bool isFirstPred = true;
165f22ef01cSRoman Divacky for (MachineBasicBlock::pred_iterator PI = BB->pred_begin(),
166f22ef01cSRoman Divacky E = BB->pred_end(); PI != E; ++PI) {
167f22ef01cSRoman Divacky MachineBasicBlock *PredBB = *PI;
168f22ef01cSRoman Divacky unsigned PredVal = GetValueAtEndOfBlockInternal(PredBB);
169f22ef01cSRoman Divacky PredValues.push_back(std::make_pair(PredBB, PredVal));
170f22ef01cSRoman Divacky
171f22ef01cSRoman Divacky // Compute SingularValue.
172f22ef01cSRoman Divacky if (isFirstPred) {
173f22ef01cSRoman Divacky SingularValue = PredVal;
174f22ef01cSRoman Divacky isFirstPred = false;
175f22ef01cSRoman Divacky } else if (PredVal != SingularValue)
176f22ef01cSRoman Divacky SingularValue = 0;
177f22ef01cSRoman Divacky }
178f22ef01cSRoman Divacky
179f22ef01cSRoman Divacky // Otherwise, if all the merged values are the same, just use it.
180f22ef01cSRoman Divacky if (SingularValue != 0)
181f22ef01cSRoman Divacky return SingularValue;
182f22ef01cSRoman Divacky
183f22ef01cSRoman Divacky // If an identical PHI is already in BB, just reuse it.
184f22ef01cSRoman Divacky unsigned DupPHI = LookForIdenticalPHI(BB, PredValues);
185f22ef01cSRoman Divacky if (DupPHI)
186f22ef01cSRoman Divacky return DupPHI;
187f22ef01cSRoman Divacky
188f22ef01cSRoman Divacky // Otherwise, we do need a PHI: insert one now.
189dff0c46cSDimitry Andric MachineBasicBlock::iterator Loc = BB->empty() ? BB->end() : BB->begin();
190139f7f9bSDimitry Andric MachineInstrBuilder InsertedPHI = InsertNewDef(TargetOpcode::PHI, BB,
191f22ef01cSRoman Divacky Loc, VRC, MRI, TII);
192f22ef01cSRoman Divacky
193f22ef01cSRoman Divacky // Fill in all the predecessors of the PHI.
194f22ef01cSRoman Divacky for (unsigned i = 0, e = PredValues.size(); i != e; ++i)
195139f7f9bSDimitry Andric InsertedPHI.addReg(PredValues[i].second).addMBB(PredValues[i].first);
196f22ef01cSRoman Divacky
197f22ef01cSRoman Divacky // See if the PHI node can be merged to a single value. This can happen in
198f22ef01cSRoman Divacky // loop cases when we get a PHI of itself and one other value.
199f22ef01cSRoman Divacky if (unsigned ConstVal = InsertedPHI->isConstantValuePHI()) {
200f22ef01cSRoman Divacky InsertedPHI->eraseFromParent();
201f22ef01cSRoman Divacky return ConstVal;
202f22ef01cSRoman Divacky }
203f22ef01cSRoman Divacky
204f22ef01cSRoman Divacky // If the client wants to know about all new instructions, tell it.
205f22ef01cSRoman Divacky if (InsertedPHIs) InsertedPHIs->push_back(InsertedPHI);
206f22ef01cSRoman Divacky
207*4ba319b5SDimitry Andric LLVM_DEBUG(dbgs() << " Inserted PHI: " << *InsertedPHI << "\n");
208f22ef01cSRoman Divacky return InsertedPHI->getOperand(0).getReg();
209f22ef01cSRoman Divacky }
210f22ef01cSRoman Divacky
211f22ef01cSRoman Divacky static
findCorrespondingPred(const MachineInstr * MI,MachineOperand * U)212f22ef01cSRoman Divacky MachineBasicBlock *findCorrespondingPred(const MachineInstr *MI,
213f22ef01cSRoman Divacky MachineOperand *U) {
214f22ef01cSRoman Divacky for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
215f22ef01cSRoman Divacky if (&MI->getOperand(i) == U)
216f22ef01cSRoman Divacky return MI->getOperand(i+1).getMBB();
217f22ef01cSRoman Divacky }
218f22ef01cSRoman Divacky
219f22ef01cSRoman Divacky llvm_unreachable("MachineOperand::getParent() failure?");
220f22ef01cSRoman Divacky }
221f22ef01cSRoman Divacky
222f22ef01cSRoman Divacky /// RewriteUse - Rewrite a use of the symbolic value. This handles PHI nodes,
223f22ef01cSRoman Divacky /// which use their value in the corresponding predecessor.
RewriteUse(MachineOperand & U)224f22ef01cSRoman Divacky void MachineSSAUpdater::RewriteUse(MachineOperand &U) {
225f22ef01cSRoman Divacky MachineInstr *UseMI = U.getParent();
226f22ef01cSRoman Divacky unsigned NewVR = 0;
227f22ef01cSRoman Divacky if (UseMI->isPHI()) {
228f22ef01cSRoman Divacky MachineBasicBlock *SourceBB = findCorrespondingPred(UseMI, &U);
229f22ef01cSRoman Divacky NewVR = GetValueAtEndOfBlockInternal(SourceBB);
230f22ef01cSRoman Divacky } else {
231f22ef01cSRoman Divacky NewVR = GetValueInMiddleOfBlock(UseMI->getParent());
232f22ef01cSRoman Divacky }
233f22ef01cSRoman Divacky
234f22ef01cSRoman Divacky U.setReg(NewVR);
235f22ef01cSRoman Divacky }
236f22ef01cSRoman Divacky
237f22ef01cSRoman Divacky /// SSAUpdaterTraits<MachineSSAUpdater> - Traits for the SSAUpdaterImpl
238f22ef01cSRoman Divacky /// template, specialized for MachineSSAUpdater.
239f22ef01cSRoman Divacky namespace llvm {
2402cab237bSDimitry Andric
241f22ef01cSRoman Divacky template<>
242f22ef01cSRoman Divacky class SSAUpdaterTraits<MachineSSAUpdater> {
243f22ef01cSRoman Divacky public:
2442cab237bSDimitry Andric using BlkT = MachineBasicBlock;
2452cab237bSDimitry Andric using ValT = unsigned;
2462cab237bSDimitry Andric using PhiT = MachineInstr;
2472cab237bSDimitry Andric using BlkSucc_iterator = MachineBasicBlock::succ_iterator;
248f22ef01cSRoman Divacky
BlkSucc_begin(BlkT * BB)249f22ef01cSRoman Divacky static BlkSucc_iterator BlkSucc_begin(BlkT *BB) { return BB->succ_begin(); }
BlkSucc_end(BlkT * BB)250f22ef01cSRoman Divacky static BlkSucc_iterator BlkSucc_end(BlkT *BB) { return BB->succ_end(); }
251f22ef01cSRoman Divacky
2527ae0e2c9SDimitry Andric /// Iterator for PHI operands.
2537ae0e2c9SDimitry Andric class PHI_iterator {
2547ae0e2c9SDimitry Andric private:
2557ae0e2c9SDimitry Andric MachineInstr *PHI;
2567ae0e2c9SDimitry Andric unsigned idx;
2577ae0e2c9SDimitry Andric
2587ae0e2c9SDimitry Andric public:
PHI_iterator(MachineInstr * P)2597ae0e2c9SDimitry Andric explicit PHI_iterator(MachineInstr *P) // begin iterator
2607ae0e2c9SDimitry Andric : PHI(P), idx(1) {}
PHI_iterator(MachineInstr * P,bool)2617ae0e2c9SDimitry Andric PHI_iterator(MachineInstr *P, bool) // end iterator
2627ae0e2c9SDimitry Andric : PHI(P), idx(PHI->getNumOperands()) {}
2637ae0e2c9SDimitry Andric
operator ++()2647ae0e2c9SDimitry Andric PHI_iterator &operator++() { idx += 2; return *this; }
operator ==(const PHI_iterator & x) const2657ae0e2c9SDimitry Andric bool operator==(const PHI_iterator& x) const { return idx == x.idx; }
operator !=(const PHI_iterator & x) const2667ae0e2c9SDimitry Andric bool operator!=(const PHI_iterator& x) const { return !operator==(x); }
2672cab237bSDimitry Andric
getIncomingValue()2687ae0e2c9SDimitry Andric unsigned getIncomingValue() { return PHI->getOperand(idx).getReg(); }
2692cab237bSDimitry Andric
getIncomingBlock()2707ae0e2c9SDimitry Andric MachineBasicBlock *getIncomingBlock() {
2717ae0e2c9SDimitry Andric return PHI->getOperand(idx+1).getMBB();
2727ae0e2c9SDimitry Andric }
2737ae0e2c9SDimitry Andric };
2742cab237bSDimitry Andric
PHI_begin(PhiT * PHI)275f22ef01cSRoman Divacky static inline PHI_iterator PHI_begin(PhiT *PHI) { return PHI_iterator(PHI); }
2762cab237bSDimitry Andric
PHI_end(PhiT * PHI)277f22ef01cSRoman Divacky static inline PHI_iterator PHI_end(PhiT *PHI) {
278f22ef01cSRoman Divacky return PHI_iterator(PHI, true);
279f22ef01cSRoman Divacky }
280f22ef01cSRoman Divacky
281f22ef01cSRoman Divacky /// FindPredecessorBlocks - Put the predecessors of BB into the Preds
282f22ef01cSRoman Divacky /// vector.
FindPredecessorBlocks(MachineBasicBlock * BB,SmallVectorImpl<MachineBasicBlock * > * Preds)283f22ef01cSRoman Divacky static void FindPredecessorBlocks(MachineBasicBlock *BB,
284f22ef01cSRoman Divacky SmallVectorImpl<MachineBasicBlock*> *Preds){
285f22ef01cSRoman Divacky for (MachineBasicBlock::pred_iterator PI = BB->pred_begin(),
286f22ef01cSRoman Divacky E = BB->pred_end(); PI != E; ++PI)
287f22ef01cSRoman Divacky Preds->push_back(*PI);
288f22ef01cSRoman Divacky }
289f22ef01cSRoman Divacky
290f22ef01cSRoman Divacky /// GetUndefVal - Create an IMPLICIT_DEF instruction with a new register.
291f22ef01cSRoman Divacky /// Add it into the specified block and return the register.
GetUndefVal(MachineBasicBlock * BB,MachineSSAUpdater * Updater)292f22ef01cSRoman Divacky static unsigned GetUndefVal(MachineBasicBlock *BB,
293f22ef01cSRoman Divacky MachineSSAUpdater *Updater) {
294f22ef01cSRoman Divacky // Insert an implicit_def to represent an undef value.
295f22ef01cSRoman Divacky MachineInstr *NewDef = InsertNewDef(TargetOpcode::IMPLICIT_DEF,
296f22ef01cSRoman Divacky BB, BB->getFirstTerminator(),
297f22ef01cSRoman Divacky Updater->VRC, Updater->MRI,
298f22ef01cSRoman Divacky Updater->TII);
299f22ef01cSRoman Divacky return NewDef->getOperand(0).getReg();
300f22ef01cSRoman Divacky }
301f22ef01cSRoman Divacky
302f22ef01cSRoman Divacky /// CreateEmptyPHI - Create a PHI instruction that defines a new register.
303f22ef01cSRoman Divacky /// Add it into the specified block and return the register.
CreateEmptyPHI(MachineBasicBlock * BB,unsigned NumPreds,MachineSSAUpdater * Updater)304f22ef01cSRoman Divacky static unsigned CreateEmptyPHI(MachineBasicBlock *BB, unsigned NumPreds,
305f22ef01cSRoman Divacky MachineSSAUpdater *Updater) {
306dff0c46cSDimitry Andric MachineBasicBlock::iterator Loc = BB->empty() ? BB->end() : BB->begin();
307f22ef01cSRoman Divacky MachineInstr *PHI = InsertNewDef(TargetOpcode::PHI, BB, Loc,
308f22ef01cSRoman Divacky Updater->VRC, Updater->MRI,
309f22ef01cSRoman Divacky Updater->TII);
310f22ef01cSRoman Divacky return PHI->getOperand(0).getReg();
311f22ef01cSRoman Divacky }
312f22ef01cSRoman Divacky
313f22ef01cSRoman Divacky /// AddPHIOperand - Add the specified value as an operand of the PHI for
314f22ef01cSRoman Divacky /// the specified predecessor block.
AddPHIOperand(MachineInstr * PHI,unsigned Val,MachineBasicBlock * Pred)315f22ef01cSRoman Divacky static void AddPHIOperand(MachineInstr *PHI, unsigned Val,
316f22ef01cSRoman Divacky MachineBasicBlock *Pred) {
317139f7f9bSDimitry Andric MachineInstrBuilder(*Pred->getParent(), PHI).addReg(Val).addMBB(Pred);
318f22ef01cSRoman Divacky }
319f22ef01cSRoman Divacky
320f22ef01cSRoman Divacky /// InstrIsPHI - Check if an instruction is a PHI.
InstrIsPHI(MachineInstr * I)321f22ef01cSRoman Divacky static MachineInstr *InstrIsPHI(MachineInstr *I) {
322f22ef01cSRoman Divacky if (I && I->isPHI())
323f22ef01cSRoman Divacky return I;
32491bc56edSDimitry Andric return nullptr;
325f22ef01cSRoman Divacky }
326f22ef01cSRoman Divacky
327f22ef01cSRoman Divacky /// ValueIsPHI - Check if the instruction that defines the specified register
328f22ef01cSRoman Divacky /// is a PHI instruction.
ValueIsPHI(unsigned Val,MachineSSAUpdater * Updater)329f22ef01cSRoman Divacky static MachineInstr *ValueIsPHI(unsigned Val, MachineSSAUpdater *Updater) {
330f22ef01cSRoman Divacky return InstrIsPHI(Updater->MRI->getVRegDef(Val));
331f22ef01cSRoman Divacky }
332f22ef01cSRoman Divacky
333f22ef01cSRoman Divacky /// ValueIsNewPHI - Like ValueIsPHI but also check if the PHI has no source
334f22ef01cSRoman Divacky /// operands, i.e., it was just added.
ValueIsNewPHI(unsigned Val,MachineSSAUpdater * Updater)335f22ef01cSRoman Divacky static MachineInstr *ValueIsNewPHI(unsigned Val, MachineSSAUpdater *Updater) {
336f22ef01cSRoman Divacky MachineInstr *PHI = ValueIsPHI(Val, Updater);
337f22ef01cSRoman Divacky if (PHI && PHI->getNumOperands() <= 1)
338f22ef01cSRoman Divacky return PHI;
33991bc56edSDimitry Andric return nullptr;
340f22ef01cSRoman Divacky }
341f22ef01cSRoman Divacky
342f22ef01cSRoman Divacky /// GetPHIValue - For the specified PHI instruction, return the register
343f22ef01cSRoman Divacky /// that it defines.
GetPHIValue(MachineInstr * PHI)344f22ef01cSRoman Divacky static unsigned GetPHIValue(MachineInstr *PHI) {
345f22ef01cSRoman Divacky return PHI->getOperand(0).getReg();
346f22ef01cSRoman Divacky }
347f22ef01cSRoman Divacky };
348f22ef01cSRoman Divacky
3492cab237bSDimitry Andric } // end namespace llvm
350f22ef01cSRoman Divacky
351f22ef01cSRoman Divacky /// GetValueAtEndOfBlockInternal - Check to see if AvailableVals has an entry
352f22ef01cSRoman Divacky /// for the specified BB and if so, return it. If not, construct SSA form by
353f22ef01cSRoman Divacky /// first calculating the required placement of PHIs and then inserting new
354f22ef01cSRoman Divacky /// PHIs where needed.
GetValueAtEndOfBlockInternal(MachineBasicBlock * BB)355f22ef01cSRoman Divacky unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
356f22ef01cSRoman Divacky AvailableValsTy &AvailableVals = getAvailableVals(AV);
357f22ef01cSRoman Divacky if (unsigned V = AvailableVals[BB])
358f22ef01cSRoman Divacky return V;
359f22ef01cSRoman Divacky
360f22ef01cSRoman Divacky SSAUpdaterImpl<MachineSSAUpdater> Impl(this, &AvailableVals, InsertedPHIs);
361f22ef01cSRoman Divacky return Impl.GetValue(BB);
362f22ef01cSRoman Divacky }
363