fold PHI nodes in SizeOffsetEvaluator whenever possible.
authorNuno Lopes <nunoplopes@sapo.pt>
Tue, 3 Jul 2012 17:13:25 +0000 (17:13 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Tue, 3 Jul 2012 17:13:25 +0000 (17:13 +0000)
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

include/llvm/Analysis/MemoryBuiltins.h
lib/Analysis/MemoryBuiltins.cpp

index 2dcd9fe08771de2152fae1e87f1b24c03603cc32..e674e74520d2b22e4edd67c12713df9e79bbfe94 100644 (file)
@@ -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);
   }
 
index b60b728b91571042eb9519a2cf8aefb66bfa35f7..39edaaf1c49a00108133874f81d8f208dc6bab8c 100644 (file)
@@ -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) {