mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[MemorySSA] Tighten up types to make our API prettier. NFC.
Patch by bryant. Differential Revision: https://reviews.llvm.org/D26126 llvm-svn: 285750
This commit is contained in:
parent
333ba0caaa
commit
1f539103d7
@ -500,7 +500,7 @@ public:
|
||||
/// access associated with it. If passed a basic block gets the memory phi
|
||||
/// node that exists for that block, if there is one. Otherwise, this will get
|
||||
/// a MemoryUseOrDef.
|
||||
MemoryAccess *getMemoryAccess(const Value *) const;
|
||||
MemoryUseOrDef *getMemoryAccess(const Instruction *) const;
|
||||
MemoryPhi *getMemoryAccess(const BasicBlock *BB) const;
|
||||
|
||||
void dump() const;
|
||||
@ -563,12 +563,12 @@ public:
|
||||
/// must be non-null.
|
||||
/// Note: If a MemoryAccess already exists for I, this function will make it
|
||||
/// inaccessible and it *must* have removeMemoryAccess called on it.
|
||||
MemoryAccess *createMemoryAccessBefore(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryAccess *InsertPt);
|
||||
MemoryAccess *createMemoryAccessAfter(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryAccess *InsertPt);
|
||||
MemoryUseOrDef *createMemoryAccessBefore(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryUseOrDef *InsertPt);
|
||||
MemoryUseOrDef *createMemoryAccessAfter(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryAccess *InsertPt);
|
||||
|
||||
/// \brief Remove a MemoryAccess from MemorySSA, including updating all
|
||||
/// definitions and uses.
|
||||
|
@ -538,7 +538,7 @@ private:
|
||||
BasicBlock *HoistBB = HoistPt->getParent();
|
||||
MemoryUseOrDef *UD;
|
||||
if (K != InsKind::Scalar)
|
||||
UD = cast<MemoryUseOrDef>(MSSA->getMemoryAccess(HoistPt));
|
||||
UD = MSSA->getMemoryAccess(HoistPt);
|
||||
|
||||
for (++II; II != InstructionsToHoist.end(); ++II) {
|
||||
Instruction *Insn = *II;
|
||||
@ -582,8 +582,7 @@ private:
|
||||
// Also check that it is safe to move the load or store from HoistPt
|
||||
// to NewHoistPt, and from Insn to NewHoistPt.
|
||||
safeToHoistLdSt(NewHoistPt, HoistPt, UD, K, NBBsOnAllPaths) &&
|
||||
safeToHoistLdSt(NewHoistPt, Insn,
|
||||
cast<MemoryUseOrDef>(MSSA->getMemoryAccess(Insn)),
|
||||
safeToHoistLdSt(NewHoistPt, Insn, MSSA->getMemoryAccess(Insn),
|
||||
K, NBBsOnAllPaths)) {
|
||||
// Extend HoistPt to NewHoistPt.
|
||||
HoistPt = NewHoistPt;
|
||||
@ -600,7 +599,7 @@ private:
|
||||
// Start over from BB.
|
||||
Start = II;
|
||||
if (K != InsKind::Scalar)
|
||||
UD = cast<MemoryUseOrDef>(MSSA->getMemoryAccess(*Start));
|
||||
UD = MSSA->getMemoryAccess(*Start);
|
||||
HoistPt = Insn;
|
||||
HoistBB = BB;
|
||||
NBBsOnAllPaths = MaxNumberOfBBSInPath;
|
||||
|
@ -1589,9 +1589,10 @@ MemoryAccess *MemorySSA::createMemoryAccessInBB(Instruction *I,
|
||||
BlockNumberingValid.erase(BB);
|
||||
return NewAccess;
|
||||
}
|
||||
MemoryAccess *MemorySSA::createMemoryAccessBefore(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryAccess *InsertPt) {
|
||||
|
||||
MemoryUseOrDef *MemorySSA::createMemoryAccessBefore(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryUseOrDef *InsertPt) {
|
||||
assert(I->getParent() == InsertPt->getBlock() &&
|
||||
"New and old access must be in the same block");
|
||||
MemoryUseOrDef *NewAccess = createDefinedAccess(I, Definition);
|
||||
@ -1601,9 +1602,9 @@ MemoryAccess *MemorySSA::createMemoryAccessBefore(Instruction *I,
|
||||
return NewAccess;
|
||||
}
|
||||
|
||||
MemoryAccess *MemorySSA::createMemoryAccessAfter(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryAccess *InsertPt) {
|
||||
MemoryUseOrDef *MemorySSA::createMemoryAccessAfter(Instruction *I,
|
||||
MemoryAccess *Definition,
|
||||
MemoryAccess *InsertPt) {
|
||||
assert(I->getParent() == InsertPt->getBlock() &&
|
||||
"New and old access must be in the same block");
|
||||
MemoryUseOrDef *NewAccess = createDefinedAccess(I, Definition);
|
||||
@ -1888,21 +1889,19 @@ void MemorySSA::verifyDefUses(Function &F) const {
|
||||
}
|
||||
|
||||
for (Instruction &I : B) {
|
||||
if (MemoryAccess *MA = getMemoryAccess(&I)) {
|
||||
assert(isa<MemoryUseOrDef>(MA) &&
|
||||
"Found a phi node not attached to a bb");
|
||||
verifyUseInDefs(cast<MemoryUseOrDef>(MA)->getDefiningAccess(), MA);
|
||||
if (MemoryUseOrDef *MA = getMemoryAccess(&I)) {
|
||||
verifyUseInDefs(MA->getDefiningAccess(), MA);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MemoryAccess *MemorySSA::getMemoryAccess(const Value *I) const {
|
||||
return ValueToMemoryAccess.lookup(I);
|
||||
MemoryUseOrDef *MemorySSA::getMemoryAccess(const Instruction *I) const {
|
||||
return cast_or_null<MemoryUseOrDef>(ValueToMemoryAccess.lookup(I));
|
||||
}
|
||||
|
||||
MemoryPhi *MemorySSA::getMemoryAccess(const BasicBlock *BB) const {
|
||||
return cast_or_null<MemoryPhi>(getMemoryAccess((const Value *)BB));
|
||||
return cast_or_null<MemoryPhi>(ValueToMemoryAccess.lookup(cast<Value>(BB)));
|
||||
}
|
||||
|
||||
/// Perform a local numbering on blocks so that instruction ordering can be
|
||||
|
@ -276,8 +276,7 @@ TEST_F(MemorySSATest, TestTripleStore) {
|
||||
unsigned I = 0;
|
||||
for (StoreInst *V : {S1, S2, S3}) {
|
||||
// Everything should be clobbered by its defining access
|
||||
MemoryAccess *DefiningAccess =
|
||||
cast<MemoryUseOrDef>(MSSA.getMemoryAccess(V))->getDefiningAccess();
|
||||
MemoryAccess *DefiningAccess = MSSA.getMemoryAccess(V)->getDefiningAccess();
|
||||
MemoryAccess *WalkerClobber = Walker->getClobberingMemoryAccess(V);
|
||||
EXPECT_EQ(DefiningAccess, WalkerClobber)
|
||||
<< "Store " << I << " doesn't have the correct clobbering access";
|
||||
|
Loading…
Reference in New Issue
Block a user