aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-23 20:08:30 +0000
committerChris Lattner <sabre@nondot.org>2003-08-23 20:08:30 +0000
commit086cb002d21a160a3292ac358f4b195a431fa69e (patch)
tree255b7317e7335755e4e1b70de58cb01257f11117 /lib
parent2d710ff7cffd1abad106e960d5a1f41233d08ee5 (diff)
downloadexternal_llvm-086cb002d21a160a3292ac358f4b195a431fa69e.zip
external_llvm-086cb002d21a160a3292ac358f4b195a431fa69e.tar.gz
external_llvm-086cb002d21a160a3292ac358f4b195a431fa69e.tar.bz2
Fix bug: TailDup/2003-08-23-InvalidatedPointers.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8078 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Scalar/TailDuplication.cpp31
1 files changed, 15 insertions, 16 deletions
diff --git a/lib/Transforms/Scalar/TailDuplication.cpp b/lib/Transforms/Scalar/TailDuplication.cpp
index d13affc..9427fc6 100644
--- a/lib/Transforms/Scalar/TailDuplication.cpp
+++ b/lib/Transforms/Scalar/TailDuplication.cpp
@@ -18,6 +18,7 @@
#include "llvm/Pass.h"
#include "llvm/Type.h"
#include "llvm/Support/CFG.h"
+#include "llvm/Support/ValueHolder.h"
#include "llvm/Transforms/Utils/Local.h"
#include "Support/Debug.h"
#include "Support/Statistic.h"
@@ -35,11 +36,11 @@ namespace {
inline void InsertPHINodesIfNecessary(Instruction *OrigInst, Value *NewInst,
BasicBlock *NewBlock);
inline Value *GetValueInBlock(BasicBlock *BB, Value *OrigVal,
- std::map<BasicBlock*, Value*> &ValueMap,
- std::map<BasicBlock*, Value*> &OutValueMap);
+ std::map<BasicBlock*, ValueHolder> &ValueMap,
+ std::map<BasicBlock*, ValueHolder> &OutValueMap);
inline Value *GetValueOutBlock(BasicBlock *BB, Value *OrigVal,
- std::map<BasicBlock*, Value*> &ValueMap,
- std::map<BasicBlock*, Value*> &OutValueMap);
+ std::map<BasicBlock*, ValueHolder> &ValueMap,
+ std::map<BasicBlock*, ValueHolder> &OutValueMap);
};
RegisterOpt<TailDup> X("tailduplicate", "Tail Duplication");
}
@@ -225,8 +226,8 @@ void TailDup::InsertPHINodesIfNecessary(Instruction *OrigInst, Value *NewInst,
// new values when in the original or new block, but will map to inserted PHI
// nodes when in other blocks.
//
- std::map<BasicBlock*, Value*> ValueMap;
- std::map<BasicBlock*, Value*> OutValueMap; // The outgoing value map
+ std::map<BasicBlock*, ValueHolder> ValueMap;
+ std::map<BasicBlock*, ValueHolder> OutValueMap; // The outgoing value map
OutValueMap[OrigBlock] = OrigInst;
OutValueMap[NewBlock ] = NewInst; // Seed the initial values...
@@ -262,9 +263,9 @@ void TailDup::InsertPHINodesIfNecessary(Instruction *OrigInst, Value *NewInst,
/// the function until there is a value available in basic block BB.
///
Value *TailDup::GetValueInBlock(BasicBlock *BB, Value *OrigVal,
- std::map<BasicBlock*, Value*> &ValueMap,
- std::map<BasicBlock*, Value*> &OutValueMap) {
- Value*& BBVal = ValueMap[BB];
+ std::map<BasicBlock*, ValueHolder> &ValueMap,
+ std::map<BasicBlock*,ValueHolder> &OutValueMap){
+ ValueHolder &BBVal = ValueMap[BB];
if (BBVal) return BBVal; // Value already computed for this block?
assert(pred_begin(BB) != pred_end(BB) &&
@@ -279,7 +280,7 @@ Value *TailDup::GetValueInBlock(BasicBlock *BB, Value *OrigVal,
BB->begin());
BBVal = PN; // Insert this into the BBVal slot in case of cycles...
- Value*& BBOutVal = OutValueMap[BB];
+ ValueHolder &BBOutVal = OutValueMap[BB];
if (BBOutVal == 0) BBOutVal = PN;
// Now that we have created the PHI node, loop over all of the predecessors of
@@ -312,8 +313,6 @@ Value *TailDup::GetValueInBlock(BasicBlock *BB, Value *OrigVal,
// Found a value to replace the PHI node with?
if (ReplVal && ReplVal != PN) {
PN->replaceAllUsesWith(ReplVal);
- BBVal = ReplVal;
- if (BBOutVal == PN) BBOutVal = ReplVal;
BB->getInstList().erase(PN); // Erase the PHI node...
} else {
++NumPHINodes;
@@ -323,10 +322,10 @@ Value *TailDup::GetValueInBlock(BasicBlock *BB, Value *OrigVal,
}
Value *TailDup::GetValueOutBlock(BasicBlock *BB, Value *OrigVal,
- std::map<BasicBlock*, Value*> &ValueMap,
- std::map<BasicBlock*, Value*> &OutValueMap) {
- Value*& BBVal = OutValueMap[BB];
+ std::map<BasicBlock*, ValueHolder> &ValueMap,
+ std::map<BasicBlock*, ValueHolder> &OutValueMap) {
+ ValueHolder &BBVal = OutValueMap[BB];
if (BBVal) return BBVal; // Value already computed for this block?
- return BBVal = GetValueInBlock(BB, OrigVal, ValueMap, OutValueMap);
+ return GetValueInBlock(BB, OrigVal, ValueMap, OutValueMap);
}