15 #ifndef LLVM_TRANSFORMS_UTILS_SSAUPDATERIMPL_H
16 #define LLVM_TRANSFORMS_UTILS_SSAUPDATERIMPL_H
28 template<
typename T>
class SSAUpdaterTraits;
30 template<
typename UpdaterT>
36 typedef typename Traits::BlkT BlkT;
37 typedef typename Traits::ValT ValT;
38 typedef typename Traits::PhiT PhiT;
54 BBInfo(BlkT *ThisBB, ValT V)
55 : BB(ThisBB), AvailableVal(V), DefBB(V ?
this : 0), BlkNum(0), IDom(0),
56 NumPreds(0), Preds(0), PHITag(0) { }
72 Updater(U), AvailableVals(A), InsertedPHIs(Ins) { }
83 if (BlockList.
size() == 0) {
84 ValT V = Traits::GetUndefVal(BB, Updater);
85 (*AvailableVals)[BB] = V;
93 return BBMap[BB]->DefBB->AvailableVal;
104 BBInfo *Info =
new (Allocator) BBInfo(BB, 0);
112 while (!WorkList.
empty()) {
115 Traits::FindPredecessorBlocks(Info->BB, &Preds);
116 Info->NumPreds = Preds.
size();
117 if (Info->NumPreds == 0)
120 Info->Preds =
static_cast<BBInfo**
>
121 (Allocator.
Allocate(Info->NumPreds *
sizeof(BBInfo*),
124 for (
unsigned p = 0; p != Info->NumPreds; ++p) {
125 BlkT *Pred = Preds[p];
129 if (BBMapBucket.second) {
130 Info->Preds[p] = BBMapBucket.second;
135 ValT PredVal = AvailableVals->
lookup(Pred);
136 BBInfo *PredInfo =
new (Allocator) BBInfo(Pred, PredVal);
137 BBMapBucket.second = PredInfo;
138 Info->Preds[p] = PredInfo;
140 if (PredInfo->AvailableVal) {
151 BBInfo *PseudoEntry =
new (Allocator) BBInfo(0, 0);
155 while (!RootList.
empty()) {
157 Info->IDom = PseudoEntry;
162 while (!WorkList.
empty()) {
163 Info = WorkList.
back();
165 if (Info->BlkNum == -2) {
167 Info->BlkNum = BlkNum++;
169 if (!Info->AvailableVal)
182 for (
typename Traits::BlkSucc_iterator SI =
183 Traits::BlkSucc_begin(Info->BB),
184 E = Traits::BlkSucc_end(Info->BB); SI != E; ++SI) {
185 BBInfo *SuccInfo = BBMap[*SI];
186 if (!SuccInfo || SuccInfo->BlkNum)
188 SuccInfo->BlkNum = -1;
192 PseudoEntry->BlkNum = BlkNum;
201 while (Blk1 != Blk2) {
202 while (Blk1->BlkNum < Blk2->BlkNum) {
207 while (Blk2->BlkNum < Blk1->BlkNum) {
232 E = BlockList->
rend();
I != E; ++
I) {
237 for (
unsigned p = 0; p != Info->NumPreds; ++p) {
238 BBInfo *Pred = Info->Preds[p];
241 if (Pred->BlkNum == 0) {
242 Pred->AvailableVal = Traits::GetUndefVal(Pred->BB, Updater);
243 (*AvailableVals)[Pred->BB] = Pred->AvailableVal;
245 Pred->BlkNum = PseudoEntry->BlkNum;
246 PseudoEntry->BlkNum++;
256 if (NewIDom && NewIDom != Info->IDom) {
257 Info->IDom = NewIDom;
269 for (; Pred != IDom; Pred = Pred->IDom) {
270 if (Pred->DefBB == Pred)
286 E = BlockList->
rend();
I != E; ++
I) {
290 if (Info->DefBB == Info)
294 BBInfo *NewDefBB = Info->IDom->DefBB;
295 for (
unsigned p = 0; p != Info->NumPreds; ++p) {
304 if (NewDefBB != Info->DefBB) {
305 Info->DefBB = NewDefBB;
322 E = BlockList->
end();
I != E; ++
I) {
325 if (Info->DefBB != Info)
330 if (Info->AvailableVal)
333 ValT
PHI = Traits::CreateEmptyPHI(Info->BB, Info->NumPreds, Updater);
334 Info->AvailableVal =
PHI;
335 (*AvailableVals)[Info->BB] =
PHI;
341 E = BlockList->
rend();
I != E; ++
I) {
344 if (Info->DefBB != Info) {
347 if (Info->NumPreds > 1)
348 (*AvailableVals)[Info->BB] = Info->DefBB->AvailableVal;
353 PhiT *
PHI = Traits::ValueIsNewPHI(Info->AvailableVal, Updater);
358 for (
unsigned p = 0; p != Info->NumPreds; ++p) {
359 BBInfo *PredInfo = Info->Preds[p];
360 BlkT *Pred = PredInfo->BB;
362 if (PredInfo->DefBB != PredInfo)
363 PredInfo = PredInfo->DefBB;
364 Traits::AddPHIOperand(PHI, PredInfo->AvailableVal, Pred);
367 DEBUG(
dbgs() <<
" Inserted PHI: " << *PHI <<
"\n");
370 if (InsertedPHIs) InsertedPHIs->
push_back(PHI);
377 for (
typename BlkT::iterator BBI = BB->begin(), BBE = BB->end();
379 PhiT *SomePHI = Traits::InstrIsPHI(BBI);
388 E = BlockList->
end();
I != E; ++
I)
400 BBMap[PHI->getParent()]->PHITag =
PHI;
402 while (!WorkList.
empty()) {
406 for (
typename Traits::PHI_iterator
I = Traits::PHI_begin(PHI),
407 E = Traits::PHI_end(PHI);
I != E; ++
I) {
408 ValT IncomingVal =
I.getIncomingValue();
409 BBInfo *PredInfo = BBMap[
I.getIncomingBlock()];
411 if (PredInfo->DefBB != PredInfo)
412 PredInfo = PredInfo->DefBB;
415 if (PredInfo->AvailableVal) {
416 if (IncomingVal == PredInfo->AvailableVal)
422 PhiT *IncomingPHIVal = Traits::ValueIsPHI(IncomingVal, Updater);
423 if (!IncomingPHIVal || IncomingPHIVal->getParent() != PredInfo->BB)
427 if (PredInfo->PHITag) {
428 if (IncomingPHIVal == PredInfo->PHITag)
432 PredInfo->PHITag = IncomingPHIVal;
444 E = BlockList->
end();
I != E; ++
I)
445 if (PhiT *
PHI = (*I)->PHITag) {
446 BlkT *BB =
PHI->getParent();
447 ValT PHIVal = Traits::GetPHIValue(
PHI);
448 (*AvailableVals)[BB] = PHIVal;
449 BBMap[BB]->AvailableVal = PHIVal;
std::reverse_iterator< iterator > reverse_iterator
void push_back(const T &Elt)
void FindPHIPlacement(BlockListTy *BlockList)
void FindExistingPHI(BlkT *BB, BlockListTy *BlockList)
T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val()
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
bool CheckIfPHIMatches(PhiT *PHI)
void FindDominators(BlockListTy *BlockList, BBInfo *PseudoEntry)
bool IsDefInDomFrontier(const BBInfo *Pred, const BBInfo *IDom)
void RecordMatchingPHIs(BlockListTy *BlockList)
SSAUpdaterImpl(UpdaterT *U, AvailableValsTy *A, SmallVectorImpl< PhiT * > *Ins)
void FindAvailableVals(BlockListTy *BlockList)
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
void * Allocate(size_t Size, size_t Alignment)
BBInfo * IntersectDominators(BBInfo *Blk1, BBInfo *Blk2)
value_type & FindAndConstruct(const KeyT &Key)
reverse_iterator rbegin()
BBInfo * BuildBlockList(BlkT *BB, BlockListTy *BlockList)
ValueT lookup(const KeyT &Val) const