From: Nuno Lopes Date: Tue, 3 Jul 2012 17:13:25 +0000 (+0000) Subject: fold PHI nodes in SizeOffsetEvaluator whenever possible. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0dff532fce434c3e9fdf9695aed8efeb5f752ed5;p=oota-llvm.git fold PHI nodes in SizeOffsetEvaluator whenever possible. Unfortunately this change requires the cache map to hold WeakVHs instead git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159667 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/MemoryBuiltins.h b/include/llvm/Analysis/MemoryBuiltins.h index 2dcd9fe0877..e674e74520d 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 { typedef IRBuilder BuilderTy; - typedef DenseMap CacheMapTy; + typedef std::pair WeakEvalType; + typedef DenseMap CacheMapTy; typedef SmallPtrSet 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 b60b728b915..39edaaf1c49 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) {