diff options
author | Chris Lattner <sabre@nondot.org> | 2005-11-18 07:29:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-11-18 07:29:44 +0000 |
commit | fed40df846438356d9edd5f6bd5191cd900e3c59 (patch) | |
tree | 17c13e0abd858532d74ca3532bdb7cb6ed444899 /lib/Transforms/Utils/PromoteMemoryToRegister.cpp | |
parent | 4b5086cc717b4d5592534034506a49df38ed0c66 (diff) |
This needs proper dominance
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24410 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/PromoteMemoryToRegister.cpp')
-rw-r--r-- | lib/Transforms/Utils/PromoteMemoryToRegister.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index d6e6b6cbb1..8d2a5209ca 100644 --- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -96,12 +96,18 @@ namespace { void run(); - /// dominates - Return true if I1 dominates I2 using the DominatorTree. + /// properlyDominates - Return true if I1 properly dominates I2. /// - bool dominates(Instruction *I1, Instruction *I2) const { + bool properlyDominates(Instruction *I1, Instruction *I2) const { if (InvokeInst *II = dyn_cast<InvokeInst>(I1)) I1 = II->getNormalDest()->begin(); - return DT[I1->getParent()]->dominates(DT[I2->getParent()]); + return DT[I1->getParent()]->properlyDominates(DT[I2->getParent()]); + } + + /// dominates - Return true if BB1 dominates BB2 using the DominatorTree. + /// + bool dominates(BasicBlock *BB1, BasicBlock *BB2) const { + return DT[BB1]->dominates(DT[BB2]); } private: @@ -168,7 +174,8 @@ void PromoteMem2Reg::run() { // Remember the basic blocks which define new values for the alloca DefiningBlocks.push_back(SI->getParent()); AllocaPointerVal = SI->getOperand(0); - } else if (LoadInst *LI = dyn_cast<LoadInst>(User)) { + } 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; @@ -194,6 +201,7 @@ void PromoteMem2Reg::run() { continue; } + if (AST) PointerAllocaValues[AllocaNum] = AllocaPointerVal; @@ -348,7 +356,8 @@ void PromoteMem2Reg::run() { for (unsigned i = 0, e = PNs.size(); i != e; ++i) if (PNs[i]) { if (Value *V = PNs[i]->hasConstantValue(true)) { - if (!isa<Instruction>(V) || dominates(cast<Instruction>(V), PNs[i])) { + if (!isa<Instruction>(V) || + properlyDominates(cast<Instruction>(V), PNs[i])) { if (AST && isa<PointerType>(PNs[i]->getType())) AST->deleteValue(PNs[i]); PNs[i]->replaceAllUsesWith(V); |