[llvm-commits] [poolalloc] r133976 - in /poolalloc/trunk: include/assistDS/TypeChecks.h lib/AssistDS/TypeChecks.cpp

Arushi Aggarwal aggarwa4 at illinois.edu
Mon Jun 27 17:22:03 PDT 2011


Author: aggarwa4
Date: Mon Jun 27 19:22:03 2011
New Revision: 133976

URL: http://llvm.org/viewvc/llvm-project?rev=133976&view=rev
Log:
1. Change prototype for setTypeInfo, also, add the correct
argument.
2. Add support for some C++ functions, for 471.omnetpp.
3. Use CallSite while handling library functions, useful
if called using invoke.
4. Add support for moving checks on PHI to the uses of the
PHI value, instead of at the PHI.

Modified:
    poolalloc/trunk/include/assistDS/TypeChecks.h
    poolalloc/trunk/lib/AssistDS/TypeChecks.cpp

Modified: poolalloc/trunk/include/assistDS/TypeChecks.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/assistDS/TypeChecks.h?rev=133976&r1=133975&r2=133976&view=diff
==============================================================================
--- poolalloc/trunk/include/assistDS/TypeChecks.h (original)
+++ poolalloc/trunk/include/assistDS/TypeChecks.h Mon Jun 27 19:22:03 2011
@@ -41,6 +41,9 @@
   std::list<Function *> AddressTakenFunctions;
   std::set<Instruction*> IndCalls;
   std::map<SelectInst*, SelectInst*> SelectInst_MD_Map;
+  std::map<SelectInst*, SelectInst*> SelectInst_BasePtr_Map;
+  std::map<PHINode*, PHINode*> PHINode_MD_Map;
+  std::map<PHINode*, PHINode*> PHINode_BasePtr_Map;
 
   // Analysis from other passes.
   TargetData *TD;
@@ -70,7 +73,7 @@
   bool visitAllocaInst(Module &M, AllocaInst &AI);
   bool visitVAArgInst(Module &M, VAArgInst &VI);
   
-  bool visitUses(Instruction *I, Instruction *AI, CastInst *BCI);
+  bool visitUses(Instruction *I, Instruction *AI, Instruction *BCI);
 
   bool visitGlobal(Module &M, GlobalVariable &GV, 
                    Constant *C, Instruction &I, SmallVector<Value*,8>);

Modified: poolalloc/trunk/lib/AssistDS/TypeChecks.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/AssistDS/TypeChecks.cpp?rev=133976&r1=133975&r2=133976&view=diff
==============================================================================
--- poolalloc/trunk/lib/AssistDS/TypeChecks.cpp (original)
+++ poolalloc/trunk/lib/AssistDS/TypeChecks.cpp Mon Jun 27 19:22:03 2011
@@ -399,6 +399,7 @@
                                        VoidPtrTy,/*dest ptr*/
                                        TypeTagPtrTy,/*metadata*/
                                        Int64Ty,/*size*/
+                                       TypeTagTy,
                                        Int32Ty,/*tag*/
                                        NULL);
   copyTypeInfo = M.getOrInsertFunction("copyTypeInfo",
@@ -630,9 +631,6 @@
         Args.push_back(II->getOperand(i));
       }
 
-      II->dump();
-      errs()<<F.getNameStr() << "\n";
-      NewF->getType()->dump();
       // Create the new call
       InvokeInst *II_New = InvokeInst::Create(NewF, 
                                               II->getNormalDest(),
@@ -1450,12 +1448,12 @@
       case Intrinsic::memcpy: 
       case Intrinsic::memmove: 
         {
-          CastInst *BCI_Src = BitCastInst::CreatePointerCast(I->getOperand(2), VoidPtrTy, "", I);
-          CastInst *BCI_Dest = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy, "", I);
+          CastInst *BCI_Src = BitCastInst::CreatePointerCast(CS.getArgument(1), VoidPtrTy, "", I);
+          CastInst *BCI_Dest = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
           std::vector<Value *> Args;
           Args.push_back(BCI_Dest);
           Args.push_back(BCI_Src);
-          CastInst *Size = CastInst::CreateIntegerCast(I->getOperand(3), Int64Ty, false, "", I);
+          CastInst *Size = CastInst::CreateIntegerCast(CS.getArgument(2), Int64Ty, false, "", I);
           Args.push_back(Size);
           Args.push_back(getTagCounter());
           CallInst::Create(copyTypeInfo, Args.begin(), Args.end(), "", I);
@@ -1463,17 +1461,46 @@
         }
 
       case Intrinsic::memset:
-        CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy, "", I);
+        CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
         std::vector<Value *> Args;
         Args.push_back(BCI);
-        CastInst *Size = CastInst::CreateIntegerCast(I->getOperand(3), Int64Ty, false, "", I);
+        CastInst *Size = CastInst::CreateIntegerCast(CS.getArgument(2), Int64Ty, false, "", I);
         Args.push_back(Size);
         Args.push_back(getTagCounter());
         CallInst::Create(trackInitInst, Args.begin(), Args.end(), "", I);
         return true;
       }
+    } else if (F->getNameStr() == std::string("_ZNKSs5c_strEv")) { //c_str
+      std::vector<Value *>Args;
+      Args.push_back(I);
+      Args.push_back(getTagCounter());
+      Constant *F = M.getOrInsertFunction("trackgetcwd", VoidTy, VoidPtrTy, Int32Ty, NULL);
+      CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
+      Instruction *InsertPt = I;  
+      if (InvokeInst *II = dyn_cast<InvokeInst>(InsertPt)) {
+        InsertPt = II->getNormalDest()->begin();
+        while (isa<PHINode>(InsertPt))
+          ++InsertPt;
+      } else
+        ++InsertPt;
+      CI->insertBefore(InsertPt);
+    } else if (F->getNameStr() == std::string("_ZNSsC1EPKcRKSaIcE")) { //c_str()
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
+      std::vector<Value *>Args;
+      Args.push_back(BCI);
+      Args.push_back(getTagCounter());
+      Constant *F = M.getOrInsertFunction("trackgetcwd", VoidTy, VoidPtrTy, Int32Ty, NULL);
+      CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
+      Instruction *InsertPt = I;  
+      if (InvokeInst *II = dyn_cast<InvokeInst>(InsertPt)) {
+        InsertPt = II->getNormalDest()->begin();
+        while (isa<PHINode>(InsertPt))
+          ++InsertPt;
+      } else
+        ++InsertPt;
+      CI->insertBefore(InsertPt);
     } else if (F->getNameStr() == std::string("accept")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(2), VoidPtrTy);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(1), VoidPtrTy);
       BCI->insertAfter(I);
       std::vector<Value *>Args;
       Args.push_back(BCI);
@@ -1482,17 +1509,17 @@
       CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
       CI->insertAfter(BCI);
     } else if (F->getNameStr() == std::string("poll")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy);
       BCI->insertAfter(I);
       std::vector<Value*>Args;
       Args.push_back(BCI);
-      Args.push_back(I->getOperand(2));
+      Args.push_back(CS.getArgument(1));
       Args.push_back(getTagCounter());
       Constant *F = M.getOrInsertFunction("trackpoll", VoidTy, VoidPtrTy, Int64Ty, Int32Ty, NULL);
       CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
       CI->insertAfter(BCI);
     } else if (F->getNameStr() == std::string("getaddrinfo")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(4), VoidPtrTy);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(3), VoidPtrTy);
       BCI->insertAfter(I);
       std::vector<Value *>Args;
       Args.push_back(BCI);
@@ -1503,7 +1530,7 @@
     } else if (F->getNameStr() == std::string("__strdup")) {
       CastInst *BCI_Dest = BitCastInst::CreatePointerCast(I, VoidPtrTy);
       BCI_Dest->insertAfter(I);
-      CastInst *BCI_Src = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy);
+      CastInst *BCI_Src = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy);
       BCI_Src->insertAfter(BCI_Dest);
       std::vector<Value *> Args;
       Args.push_back(BCI_Dest);
@@ -1515,9 +1542,9 @@
     } else if (F->getNameStr() == std::string("gettimeofday") || 
                F->getNameStr() == std::string("time") ||
                F->getNameStr() == std::string("times")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy, "", I);
-      assert (isa<PointerType>(I->getOperand(1)->getType()));
-      const PointerType * PT = cast<PointerType>(I->getOperand(1)->getType());
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
+      assert (isa<PointerType>(CS.getArgument(0)->getType()));
+      const PointerType * PT = cast<PointerType>(CS.getArgument(0)->getType());
       const Type * ET = PT->getElementType();
       Value * AllocSize = ConstantInt::get(Int64Ty, TD->getTypeAllocSize(ET));
       std::vector<Value *>Args;
@@ -1551,7 +1578,7 @@
       CallInst *CI = CallInst::Create(trackInitInst, Args.begin(), Args.end());
       CI->insertAfter(BCI);
     } else if (F->getNameStr() == std::string("gethostname")) {
-      CastInst *BCI  = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy);
+      CastInst *BCI  = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy);
       BCI->insertAfter(I);
       std::vector<Value*>Args;
       Args.push_back(BCI);
@@ -1581,9 +1608,9 @@
                F->getNameStr() == std::string("getrlimit") ||
                F->getNameStr() == std::string("stat") ||
                F->getNameStr() ==  std::string("fstat")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(2), VoidPtrTy, "", I);
-      assert (isa<PointerType>(I->getOperand(2)->getType()));
-      const PointerType * PT = cast<PointerType>(I->getOperand(2)->getType());
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(1), VoidPtrTy, "", I);
+      assert (isa<PointerType>(CS.getArgument(1)->getType()));
+      const PointerType * PT = cast<PointerType>(CS.getArgument(1)->getType());
       const Type * ET = PT->getElementType();
       Value * AllocSize = ConstantInt::get(Int64Ty, TD->getTypeAllocSize(ET));
       std::vector<Value *>Args;
@@ -1592,9 +1619,9 @@
       Args.push_back(getTagCounter());
       CallInst::Create(trackInitInst, Args.begin(), Args.end(), "", I);
     } else if (F->getNameStr() == std::string("sigaction")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(3), VoidPtrTy, "", I);
-      assert (isa<PointerType>(I->getOperand(3)->getType()));
-      const PointerType * PT = cast<PointerType>(I->getOperand(3)->getType());
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(2), VoidPtrTy, "", I);
+      assert (isa<PointerType>(CS.getArgument(2)->getType()));
+      const PointerType * PT = cast<PointerType>(CS.getArgument(2)->getType());
       const Type * ET = PT->getElementType();
       Value * AllocSize = ConstantInt::get(Int64Ty, TD->getTypeAllocSize(ET));
       std::vector<Value *>Args;
@@ -1629,32 +1656,35 @@
       Constant *F = M.getOrInsertFunction("trackctype_32", VoidTy, VoidPtrTy, Int32Ty, NULL);
       CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
       CI->insertAfter(BCI);
-    } else if (F->getNameStr() == std::string("strcat")) {
+    } else if (F->getNameStr() == std::string("strcat") ||
+               F->getNameStr() == std::string("_ZNSspLEPKc")) {
+      CastInst *BCI_Src = BitCastInst::CreatePointerCast(CS.getArgument(1), VoidPtrTy, "", I);
+      CastInst *BCI_Dest = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
       std::vector<Value *> Args;
-      Args.push_back(I->getOperand(1));
-      Args.push_back(I->getOperand(2));
+      Args.push_back(BCI_Dest);
+      Args.push_back(BCI_Src);
       Args.push_back(getTagCounter());
       Constant *F = M.getOrInsertFunction("trackStrcatInst", VoidTy, VoidPtrTy, VoidPtrTy, Int32Ty, NULL);
       CallInst::Create(F, Args.begin(), Args.end(), "", I);
     } else if (F->getNameStr() == std::string("strcpy")) {
       std::vector<Value *> Args;
-      Args.push_back(I->getOperand(1));
-      Args.push_back(I->getOperand(2));
+      Args.push_back(CS.getArgument(0));
+      Args.push_back(CS.getArgument(1));
       Args.push_back(getTagCounter());
       Constant *F = M.getOrInsertFunction("trackStrcpyInst", VoidTy, VoidPtrTy, VoidPtrTy, Int32Ty, NULL);
       CallInst::Create(F, Args.begin(), Args.end(), "", I);
     } else if (F->getNameStr() == std::string("strncpy")) {
       std::vector<Value *>Args;
-      Args.push_back(I->getOperand(1));
-      Args.push_back(I->getOperand(2));
-      Args.push_back(I->getOperand(3));
+      Args.push_back(CS.getArgument(0));
+      Args.push_back(CS.getArgument(1));
+      Args.push_back(CS.getArgument(2));
       Args.push_back(getTagCounter());
       Constant *F = M.getOrInsertFunction("trackStrncpyInst", VoidTy, VoidPtrTy, VoidPtrTy, I->getOperand(3)->getType(), Int32Ty, NULL);
       CallInst::Create(F, Args.begin(), Args.end(), "", I);
     } else if(F->getNameStr() == std::string("ftime") ||
               F->getNameStr() == std::string("gettimeofday")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy, "", I);
-      const PointerType *PTy = cast<PointerType>(I->getOperand(1)->getType());
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
+      const PointerType *PTy = cast<PointerType>(CS.getArgument(0)->getType());
       const Type * ElementType = PTy->getElementType();
       std::vector<Value *> Args;
       Args.push_back(BCI);
@@ -1663,7 +1693,7 @@
       CallInst::Create(trackInitInst, Args.begin(), Args.end(), "", I);
       return true;
     } else if(F->getNameStr() == std::string("read")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(2), VoidPtrTy);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(1), VoidPtrTy);
       BCI->insertAfter(I);
       std::vector<Value *> Args;
       Args.push_back(BCI);
@@ -1675,12 +1705,12 @@
       CI->insertAfter(BCI);
       return true;
     } else if(F->getNameStr() == std::string("fread")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy);
       BCI->insertAfter(I);
       std::vector<Value *> Args;
       Args.push_back(BCI);
       CastInst *Elem = CastInst::CreateIntegerCast(I, Int64Ty, false);
-      BinaryOperator *Size = BinaryOperator::Create(Instruction::Mul, Elem, I->getOperand(2));
+      BinaryOperator *Size = BinaryOperator::Create(Instruction::Mul, Elem, CS.getArgument(1));
       Elem->insertAfter(I);
       Size->insertAfter(Elem);
       Args.push_back(Size);
@@ -1693,7 +1723,7 @@
       BCI->insertAfter(I);
       std::vector<Value *> Args;
       Args.push_back(BCI);
-      CastInst *Size = CastInst::CreateIntegerCast(I->getOperand(2), Int64Ty, false, "", I);
+      CastInst *Size = CastInst::CreateIntegerCast(CS.getArgument(1), Int64Ty, false, "", I);
       Args.push_back(Size);
       Args.push_back(getTagCounter());
       CallInst *CI = CallInst::Create(trackInitInst, Args.begin(), Args.end());
@@ -1701,37 +1731,37 @@
       std::vector<Value *> Args1;
       Args1.push_back(BCI);
       Args1.push_back(Size);
-      CastInst *Num = CastInst::CreateIntegerCast(I->getOperand(1), Int64Ty, false, "", I);
+      CastInst *Num = CastInst::CreateIntegerCast(CS.getArgument(0), Int64Ty, false, "", I);
       Args1.push_back(Num);
       Args1.push_back(getTagCounter());
       CallInst *CI_Arr = CallInst::Create(trackArray, Args1.begin(), Args1.end());
       CI_Arr->insertAfter(CI);
       return true;
     } else if(F->getNameStr() ==  std::string("realloc")) {
-      CastInst *BCI_Src = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy);
+      CastInst *BCI_Src = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy);
       CastInst *BCI_Dest = BitCastInst::CreatePointerCast(I, VoidPtrTy);
       BCI_Src->insertAfter(I);
       BCI_Dest->insertAfter(BCI_Src);
       std::vector<Value *> Args;
       Args.push_back(BCI_Dest);
       Args.push_back(BCI_Src);
-      CastInst *Size = CastInst::CreateIntegerCast(I->getOperand(2), Int64Ty, false, "", I);
+      CastInst *Size = CastInst::CreateIntegerCast(CS.getArgument(1), Int64Ty, false, "", I);
       Args.push_back(Size);
       Args.push_back(getTagCounter());
       CallInst *CI = CallInst::Create(copyTypeInfo, Args.begin(), Args.end());
       CI->insertAfter(BCI_Dest);
       return true;
     } else if(F->getNameStr() == std::string("fgets")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy, "", I);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
       std::vector<Value *> Args;
       Args.push_back(BCI);
-      CastInst *Size = CastInst::CreateIntegerCast(I->getOperand(2), Int64Ty, false, "", I);
+      CastInst *Size = CastInst::CreateIntegerCast(CS.getArgument(1), Int64Ty, false, "", I);
       Args.push_back(Size);
       Args.push_back(getTagCounter());
       CallInst::Create(trackInitInst, Args.begin(), Args.end(), "", I);
       return true;
     } else if(F->getNameStr() == std::string("sprintf")) {
-      CastInst *BCI = BitCastInst::CreatePointerCast(I->getOperand(1), VoidPtrTy, "", I);
+      CastInst *BCI = BitCastInst::CreatePointerCast(CS.getArgument(0), VoidPtrTy, "", I);
       std::vector<Value*>Args;
       Args.push_back(BCI);
       CastInst *Size = CastInst::CreateIntegerCast(I, Int64Ty, false);
@@ -1748,13 +1778,13 @@
       // FIXME: Need to look at the format string and check
       unsigned i = 3;
       while(i < I->getNumOperands()) {
-        visitInputFunctionValue(M, I->getOperand(i), I);
+        visitInputFunctionValue(M, CS.getArgument(i-1), I);
         i++;
       }
     } else if(F->getNameStr() == std::string("fscanf")) {
       unsigned i = 3;
       while(i < I->getNumOperands()) {
-        visitInputFunctionValue(M, I->getOperand(i), I);
+        visitInputFunctionValue(M, CS.getArgument(i-1), I);
         i++;
       }
     }
@@ -1916,7 +1946,7 @@
 // AI - metadata
 // BCI - ptr
 // I - instruction whose uses to instrument
-bool TypeChecks::visitUses(Instruction *I, Instruction *AI, CastInst *BCI) {
+bool TypeChecks::visitUses(Instruction *I, Instruction *AI, Instruction *BCI) {
   for(Value::use_iterator II = I->use_begin(); II != I->use_end(); ++II) {
     if(DisablePtrCmpChecks) {
       if(isa<CmpInst>(II)) {
@@ -1939,38 +1969,79 @@
       Args.push_back(BCI_Dest);
       Args.push_back(AI);
       Args.push_back(getSizeConstant(SI->getOperand(0)->getType()));
+      Args.push_back(getTypeMarkerConstant(SI->getOperand(0)->getType()));
       Args.push_back(getTagCounter());
       // Create the call to the runtime check and place it before the copying store instruction.
       CallInst::Create(setTypeInfo, Args.begin(), Args.end(), "", SI);
     } else if(SelectInst *SelI = dyn_cast<SelectInst>(II)) {
       SelectInst *Prev = NULL;
+      SelectInst *PrevBasePtr = NULL;
       if(SelectInst_MD_Map.find(SelI) != SelectInst_MD_Map.end()) {
         Prev = SelectInst_MD_Map[SelI];
+        PrevBasePtr = SelectInst_BasePtr_Map[SelI];
       }
       SelectInst *AI_New;
+      SelectInst *BCI_New;
       if(SelI->getTrueValue() == I) {
         if(!Prev) {
           AI_New = SelectInst::Create(SelI->getCondition(), AI, Constant::getNullValue(AI->getType()), "", SelI);
+          BCI_New = SelectInst::Create(SelI->getCondition(), BCI, Constant::getNullValue(BCI->getType()), "", SelI);
         } else {
           AI_New = SelectInst::Create(SelI->getCondition(), AI, Prev->getFalseValue(), "", SelI);
+          BCI_New = SelectInst::Create(SelI->getCondition(), BCI, Prev->getFalseValue(), "", SelI);
           Prev->replaceAllUsesWith(AI_New);
+          PrevBasePtr->replaceAllUsesWith(BCI_New);
         }
       }
       else {
         if(!Prev) {
           AI_New = SelectInst::Create(SelI->getCondition(), Constant::getNullValue(AI->getType()), AI, "", SelI);
+          BCI_New = SelectInst::Create(SelI->getCondition(), Constant::getNullValue(BCI->getType()), BCI, "", SelI);
         } else {
           AI_New = SelectInst::Create(SelI->getCondition(),  Prev->getTrueValue(), AI, "", SelI);
+          BCI_New = SelectInst::Create(SelI->getCondition(),  Prev->getTrueValue(), BCI, "", SelI);
           Prev->replaceAllUsesWith(AI_New);
+          PrevBasePtr->replaceAllUsesWith(BCI_New);
         }
       }
       SelectInst_MD_Map[SelI] = AI_New;
-      AI_New->dump();
+      SelectInst_BasePtr_Map[SelI] = BCI_New;
       if(!Prev)
-        visitUses(SelI, AI_New, BCI);
+        visitUses(SelI, AI_New, BCI_New);
     } else if(PHINode *PH = dyn_cast<PHINode>(II)) {
-      BasicBlock *BB = PH->getIncomingBlock(II);
-      CallInst::Create(checkTypeInst, Args.begin(), Args.end(), "", BB->getTerminator());
+      PHINode *Prev = NULL;
+      PHINode *PrevBasePtr = NULL;
+      if(PHINode_MD_Map.find(PH) != PHINode_MD_Map.end()) {
+        Prev = PHINode_MD_Map[PH];
+        PrevBasePtr = PHINode_BasePtr_Map[PH];
+      }
+      PHINode *AI_New;
+      PHINode *BCI_New;
+      if(!Prev) {
+        AI_New = PHINode::Create(AI->getType(),  PH->getNameStr() + ".md", PH);
+        BCI_New = PHINode::Create(BCI->getType(),  PH->getNameStr() + ".baseptr", PH);
+        for(unsigned c = 0; c < PH->getNumIncomingValues(); c++) {
+          if(PH->getIncomingValue(c) == I) {
+            AI_New->addIncoming(AI, PH->getIncomingBlock(c));
+            BCI_New->addIncoming(BCI, PH->getIncomingBlock(c));
+          }
+          else {
+            AI_New->addIncoming(Constant::getNullValue(AI->getType()), PH->getIncomingBlock(c));
+            BCI_New->addIncoming(Constant::getNullValue(BCI->getType()), PH->getIncomingBlock(c));
+          }
+          PHINode_MD_Map[PH] = AI_New;
+          PHINode_BasePtr_Map[PH] = BCI_New;
+        }
+        visitUses(PH, AI_New, BCI_New);
+      }
+      else {
+        for(unsigned c = 0; c < PH->getNumIncomingValues(); c++) {
+          if(PH->getIncomingValue(c) == I) {
+            Prev->setIncomingValue(c, AI);
+            PrevBasePtr->setIncomingValue(c, BCI);
+          }
+        }
+      }
     } else if(BitCastInst *BI = dyn_cast<BitCastInst>(II)) {
       visitUses(BI, AI, BCI);
       //CallInst::Create(checkTypeInst, Args.begin(), Args.end(), "", cast<Instruction>(II.getUse().getUser()));





More information about the llvm-commits mailing list