diff options
-rw-r--r-- | include/llvm/Analysis/MemoryBuiltins.h | 12 | ||||
-rw-r--r-- | lib/Analysis/MemoryBuiltins.cpp | 14 |
2 files changed, 20 insertions, 6 deletions
diff --git a/include/llvm/Analysis/MemoryBuiltins.h b/include/llvm/Analysis/MemoryBuiltins.h index 2dcd9fe087..e674e74520 100644 --- a/include/llvm/Analysis/MemoryBuiltins.h +++ b/include/llvm/Analysis/MemoryBuiltins.h @@ -22,6 +22,7 @@ #include "llvm/Support/DataTypes.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/TargetFolder.h" +#include "llvm/Support/ValueHandle.h" namespace llvm { class CallInst; @@ -195,7 +196,8 @@ class ObjectSizeOffsetEvaluator : public InstVisitor<ObjectSizeOffsetEvaluator, SizeOffsetEvalType> { typedef IRBuilder<true, TargetFolder> BuilderTy; - typedef DenseMap<const Value*, SizeOffsetEvalType> CacheMapTy; + typedef std::pair<WeakVH, WeakVH> WeakEvalType; + typedef DenseMap<const Value*, WeakEvalType> CacheMapTy; typedef SmallPtrSet<const Value*, 8> PtrSetTy; const TargetData *TD; @@ -216,19 +218,19 @@ public: ObjectSizeOffsetEvaluator(const TargetData *TD, LLVMContext &Context); SizeOffsetEvalType compute(Value *V); - bool knownSize(SizeOffsetEvalType &SizeOffset) { + bool knownSize(SizeOffsetEvalType SizeOffset) { return SizeOffset.first; } - bool knownOffset(SizeOffsetEvalType &SizeOffset) { + bool knownOffset(SizeOffsetEvalType SizeOffset) { return SizeOffset.second; } - bool anyKnown(SizeOffsetEvalType &SizeOffset) { + bool anyKnown(SizeOffsetEvalType SizeOffset) { return knownSize(SizeOffset) || knownOffset(SizeOffset); } - bool bothKnown(SizeOffsetEvalType &SizeOffset) { + bool bothKnown(SizeOffsetEvalType SizeOffset) { return knownSize(SizeOffset) && knownOffset(SizeOffset); } diff --git a/lib/Analysis/MemoryBuiltins.cpp b/lib/Analysis/MemoryBuiltins.cpp index b60b728b91..39edaaf1c4 100644 --- a/lib/Analysis/MemoryBuiltins.cpp +++ b/lib/Analysis/MemoryBuiltins.cpp @@ -682,7 +682,19 @@ SizeOffsetEvalType ObjectSizeOffsetEvaluator::visitPHINode(PHINode &PHI) { SizePHI->addIncoming(EdgeData.first, PHI.getIncomingBlock(i)); OffsetPHI->addIncoming(EdgeData.second, PHI.getIncomingBlock(i)); } - return std::make_pair(SizePHI, OffsetPHI); + + Value *Size = SizePHI, *Offset = OffsetPHI, *Tmp; + if ((Tmp = SizePHI->hasConstantValue())) { + Size = Tmp; + SizePHI->replaceAllUsesWith(Size); + SizePHI->eraseFromParent(); + } + if ((Tmp = OffsetPHI->hasConstantValue())) { + Offset = Tmp; + OffsetPHI->replaceAllUsesWith(Offset); + OffsetPHI->eraseFromParent(); + } + return std::make_pair(Size, Offset); } SizeOffsetEvalType ObjectSizeOffsetEvaluator::visitSelectInst(SelectInst &I) { |