Changeset View
Changeset View
Standalone View
Standalone View
llvm/include/llvm/Analysis/MemorySSA.h
Show First 20 Lines • Show All 1,196 Lines • ▼ Show 20 Lines | |||||
/// memory location through phi nodes for the user. | /// memory location through phi nodes for the user. | ||||
class upward_defs_iterator | class upward_defs_iterator | ||||
: public iterator_facade_base<upward_defs_iterator, | : public iterator_facade_base<upward_defs_iterator, | ||||
std::forward_iterator_tag, | std::forward_iterator_tag, | ||||
const MemoryAccessPair> { | const MemoryAccessPair> { | ||||
using BaseT = upward_defs_iterator::iterator_facade_base; | using BaseT = upward_defs_iterator::iterator_facade_base; | ||||
public: | public: | ||||
upward_defs_iterator(const MemoryAccessPair &Info, DominatorTree *DT, | upward_defs_iterator(const MemoryAccessPair &Info, DominatorTree *DT) | ||||
bool *PerformedPhiTranslation = nullptr) | |||||
: DefIterator(Info.first), Location(Info.second), | : DefIterator(Info.first), Location(Info.second), | ||||
OriginalAccess(Info.first), DT(DT), | OriginalAccess(Info.first), DT(DT) { | ||||
PerformedPhiTranslation(PerformedPhiTranslation) { | |||||
CurrentPair.first = nullptr; | CurrentPair.first = nullptr; | ||||
WalkingPhi = Info.first && isa<MemoryPhi>(Info.first); | WalkingPhi = Info.first && isa<MemoryPhi>(Info.first); | ||||
fillInCurrentPair(); | fillInCurrentPair(); | ||||
} | } | ||||
upward_defs_iterator() { CurrentPair.first = nullptr; } | upward_defs_iterator() { CurrentPair.first = nullptr; } | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | if (WalkingPhi && Location.Ptr) { | ||||
Value *TransAddr = Translator.getAddr(); | Value *TransAddr = Translator.getAddr(); | ||||
if (TransAddr != Location.Ptr) { | if (TransAddr != Location.Ptr) { | ||||
CurrentPair.second = CurrentPair.second.getWithNewPtr(TransAddr); | CurrentPair.second = CurrentPair.second.getWithNewPtr(TransAddr); | ||||
if (TransAddr && | if (TransAddr && | ||||
!IsGuaranteedLoopInvariant(TransAddr)) | !IsGuaranteedLoopInvariant(TransAddr)) | ||||
CurrentPair.second = CurrentPair.second.getWithNewSize( | CurrentPair.second = CurrentPair.second.getWithNewSize( | ||||
LocationSize::beforeOrAfterPointer()); | LocationSize::beforeOrAfterPointer()); | ||||
if (PerformedPhiTranslation) | |||||
*PerformedPhiTranslation = true; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
MemoryAccessPair CurrentPair; | MemoryAccessPair CurrentPair; | ||||
memoryaccess_def_iterator DefIterator; | memoryaccess_def_iterator DefIterator; | ||||
MemoryLocation Location; | MemoryLocation Location; | ||||
MemoryAccess *OriginalAccess = nullptr; | MemoryAccess *OriginalAccess = nullptr; | ||||
DominatorTree *DT = nullptr; | DominatorTree *DT = nullptr; | ||||
bool WalkingPhi = false; | bool WalkingPhi = false; | ||||
bool *PerformedPhiTranslation = nullptr; | |||||
}; | }; | ||||
inline upward_defs_iterator | inline upward_defs_iterator | ||||
upward_defs_begin(const MemoryAccessPair &Pair, DominatorTree &DT, | upward_defs_begin(const MemoryAccessPair &Pair, DominatorTree &DT) { | ||||
bool *PerformedPhiTranslation = nullptr) { | return upward_defs_iterator(Pair, &DT); | ||||
return upward_defs_iterator(Pair, &DT, PerformedPhiTranslation); | |||||
} | } | ||||
inline upward_defs_iterator upward_defs_end() { return upward_defs_iterator(); } | inline upward_defs_iterator upward_defs_end() { return upward_defs_iterator(); } | ||||
inline iterator_range<upward_defs_iterator> | inline iterator_range<upward_defs_iterator> | ||||
upward_defs(const MemoryAccessPair &Pair, DominatorTree &DT) { | upward_defs(const MemoryAccessPair &Pair, DominatorTree &DT) { | ||||
return make_range(upward_defs_begin(Pair, DT), upward_defs_end()); | return make_range(upward_defs_begin(Pair, DT), upward_defs_end()); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 62 Lines • Show Last 20 Lines |