forked from OSchip/llvm-project
Hoist the AllocaInfo struct to the top of the file.
This struct is nicely independent of everything else, and we already needed a foward declaration here. It's simpler to just define it immediately. llvm-svn: 186780
This commit is contained in:
parent
4711793e8a
commit
48e11fd76d
|
@ -102,7 +102,63 @@ bool llvm::isAllocaPromotable(const AllocaInst *AI) {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct AllocaInfo;
|
struct AllocaInfo {
|
||||||
|
SmallVector<BasicBlock *, 32> DefiningBlocks;
|
||||||
|
SmallVector<BasicBlock *, 32> UsingBlocks;
|
||||||
|
|
||||||
|
StoreInst *OnlyStore;
|
||||||
|
BasicBlock *OnlyBlock;
|
||||||
|
bool OnlyUsedInOneBlock;
|
||||||
|
|
||||||
|
Value *AllocaPointerVal;
|
||||||
|
DbgDeclareInst *DbgDeclare;
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
DefiningBlocks.clear();
|
||||||
|
UsingBlocks.clear();
|
||||||
|
OnlyStore = 0;
|
||||||
|
OnlyBlock = 0;
|
||||||
|
OnlyUsedInOneBlock = true;
|
||||||
|
AllocaPointerVal = 0;
|
||||||
|
DbgDeclare = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Scan the uses of the specified alloca, filling in the AllocaInfo used
|
||||||
|
/// by the rest of the pass to reason about the uses of this alloca.
|
||||||
|
void AnalyzeAlloca(AllocaInst *AI) {
|
||||||
|
clear();
|
||||||
|
|
||||||
|
// As we scan the uses of the alloca instruction, keep track of stores,
|
||||||
|
// and decide whether all of the loads and stores to the alloca are within
|
||||||
|
// the same basic block.
|
||||||
|
for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end();
|
||||||
|
UI != E;) {
|
||||||
|
Instruction *User = cast<Instruction>(*UI++);
|
||||||
|
|
||||||
|
if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
|
||||||
|
// Remember the basic blocks which define new values for the alloca
|
||||||
|
DefiningBlocks.push_back(SI->getParent());
|
||||||
|
AllocaPointerVal = SI->getOperand(0);
|
||||||
|
OnlyStore = SI;
|
||||||
|
} else {
|
||||||
|
LoadInst *LI = cast<LoadInst>(User);
|
||||||
|
// Otherwise it must be a load instruction, keep track of variable
|
||||||
|
// reads.
|
||||||
|
UsingBlocks.push_back(LI->getParent());
|
||||||
|
AllocaPointerVal = LI;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OnlyUsedInOneBlock) {
|
||||||
|
if (OnlyBlock == 0)
|
||||||
|
OnlyBlock = User->getParent();
|
||||||
|
else if (OnlyBlock != User->getParent())
|
||||||
|
OnlyUsedInOneBlock = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DbgDeclare = FindAllocaDbgDeclare(AI);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Data package used by RenamePass()
|
// Data package used by RenamePass()
|
||||||
class RenamePassData {
|
class RenamePassData {
|
||||||
|
@ -266,64 +322,6 @@ private:
|
||||||
bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version);
|
bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AllocaInfo {
|
|
||||||
SmallVector<BasicBlock *, 32> DefiningBlocks;
|
|
||||||
SmallVector<BasicBlock *, 32> UsingBlocks;
|
|
||||||
|
|
||||||
StoreInst *OnlyStore;
|
|
||||||
BasicBlock *OnlyBlock;
|
|
||||||
bool OnlyUsedInOneBlock;
|
|
||||||
|
|
||||||
Value *AllocaPointerVal;
|
|
||||||
DbgDeclareInst *DbgDeclare;
|
|
||||||
|
|
||||||
void clear() {
|
|
||||||
DefiningBlocks.clear();
|
|
||||||
UsingBlocks.clear();
|
|
||||||
OnlyStore = 0;
|
|
||||||
OnlyBlock = 0;
|
|
||||||
OnlyUsedInOneBlock = true;
|
|
||||||
AllocaPointerVal = 0;
|
|
||||||
DbgDeclare = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Scan the uses of the specified alloca, filling in the AllocaInfo used
|
|
||||||
/// by the rest of the pass to reason about the uses of this alloca.
|
|
||||||
void AnalyzeAlloca(AllocaInst *AI) {
|
|
||||||
clear();
|
|
||||||
|
|
||||||
// As we scan the uses of the alloca instruction, keep track of stores,
|
|
||||||
// and decide whether all of the loads and stores to the alloca are within
|
|
||||||
// the same basic block.
|
|
||||||
for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end();
|
|
||||||
UI != E;) {
|
|
||||||
Instruction *User = cast<Instruction>(*UI++);
|
|
||||||
|
|
||||||
if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
|
|
||||||
// Remember the basic blocks which define new values for the alloca
|
|
||||||
DefiningBlocks.push_back(SI->getParent());
|
|
||||||
AllocaPointerVal = SI->getOperand(0);
|
|
||||||
OnlyStore = SI;
|
|
||||||
} else {
|
|
||||||
LoadInst *LI = cast<LoadInst>(User);
|
|
||||||
// Otherwise it must be a load instruction, keep track of variable
|
|
||||||
// reads.
|
|
||||||
UsingBlocks.push_back(LI->getParent());
|
|
||||||
AllocaPointerVal = LI;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OnlyUsedInOneBlock) {
|
|
||||||
if (OnlyBlock == 0)
|
|
||||||
OnlyBlock = User->getParent();
|
|
||||||
else if (OnlyBlock != User->getParent())
|
|
||||||
OnlyUsedInOneBlock = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgDeclare = FindAllocaDbgDeclare(AI);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end of anonymous namespace
|
} // end of anonymous namespace
|
||||||
|
|
||||||
static void removeLifetimeIntrinsicUsers(AllocaInst *AI) {
|
static void removeLifetimeIntrinsicUsers(AllocaInst *AI) {
|
||||||
|
|
Loading…
Reference in New Issue