aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2008-11-08 04:12:17 +0000
committerDaniel Dunbar <daniel@zuster.org>2008-11-08 04:12:17 +0000
commit746867c8b6ded86e450131852d0949644f54927c (patch)
tree12836718aae5f36a76bb05cca3f60645a344b806 /lib/Transforms/Utils/PromoteMemoryToRegister.cpp
parent77e0c85dcccc692d4ef458912e4fe2310c892f8a (diff)
Rework r58829, allowing removal of dbg info intrinsics during alloca
promotion. - Eliminate uses after free and simplify tests. Devang: Please check that this is still doing what you intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58887 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/PromoteMemoryToRegister.cpp')
-rw-r--r--lib/Transforms/Utils/PromoteMemoryToRegister.cpp44
1 files changed, 24 insertions, 20 deletions
diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
index a567bdb667..6a4cdc62a9 100644
--- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
+++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
@@ -80,19 +80,12 @@ bool llvm::isAllocaPromotable(const AllocaInst *AI) {
return false; // Don't allow a store OF the AI, only INTO the AI.
if (SI->isVolatile())
return false;
+ } else if (const BitCastInst *BC = dyn_cast<BitCastInst>(*UI)) {
+ // Uses by dbg info shouldn't inhibit promotion.
+ if (!BC->hasOneUse() || !isa<DbgInfoIntrinsic>(*BC->use_begin()))
+ return false;
} else {
- const BitCastInst *BC = dyn_cast<BitCastInst>(*UI);
- if (!BC)
- return false; // Not a load or store or dbg intrinsic.
- Value::use_const_iterator BCUI = BC->use_begin(), BCUE = BC->use_end();
- if (BCUI == BCUE)
- return false; // Not a dbg intrinsic.
- const DbgInfoIntrinsic *DI = dyn_cast<DbgInfoIntrinsic>(*BCUI);
- if (!DI)
- return false; // Not a dbg intrinsic.
- BCUI++;
- if (BCUI != BCUE)
- return false; // Not a dbg intrinsic use.
+ return false;
}
return true;
@@ -284,6 +277,21 @@ namespace {
AllocaPointerVal = 0;
}
+ /// RemoveDebugUses - Remove uses of the alloca in DbgInfoInstrinsics.
+ void RemoveDebugUses(AllocaInst *AI) {
+ for (Value::use_iterator U = AI->use_begin(), E = AI->use_end();
+ U != E;) {
+ Instruction *User = cast<Instruction>(*U);
+ ++U;
+ if (BitCastInst *BC = dyn_cast<BitCastInst>(User)) {
+ assert(BC->hasOneUse() && "Unexpected alloca uses!");
+ DbgInfoIntrinsic *DI = cast<DbgInfoIntrinsic>(*BC->use_begin());
+ DI->eraseFromParent();
+ BC->eraseFromParent();
+ }
+ }
+ }
+
/// AnalyzeAlloca - Scan the uses of the specified alloca, filling in our
/// ivars.
void AnalyzeAlloca(AllocaInst *AI) {
@@ -295,14 +303,7 @@ namespace {
for (Value::use_iterator U = AI->use_begin(), E = AI->use_end();
U != E; ++U) {
Instruction *User = cast<Instruction>(*U);
- if (BitCastInst *BC = dyn_cast<BitCastInst>(User)) {
- // Remove dbg intrinsic uses now.
- Value::use_iterator BCUI = BC->use_begin();
- DbgInfoIntrinsic *DI = cast<DbgInfoIntrinsic>(*BCUI);
- assert (next(BCUI) == BC->use_end() && "Unexpected alloca uses!");
- DI->eraseFromParent();
- BC->eraseFromParent();
- } else if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
+ 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);
@@ -343,6 +344,9 @@ void PromoteMem2Reg::run() {
assert(AI->getParent()->getParent() == &F &&
"All allocas should be in the same function, which is same as DF!");
+ // Remove any uses of this alloca in DbgInfoInstrinsics.
+ Info.RemoveDebugUses(AI);
+
if (AI->use_empty()) {
// If there are no uses of the alloca, just delete it now.
if (AST) AST->deleteValue(AI);