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