Fixed a bug so initialization code is always inserted in main
authorAnand Shukla <ashukla@cs.uiuc.edu>
Thu, 5 Jun 2003 06:02:46 +0000 (06:02 +0000)
committerAnand Shukla <ashukla@cs.uiuc.edu>
Thu, 5 Jun 2003 06:02:46 +0000 (06:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6622 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/ProfilePaths/EdgeCode.cpp
lib/Transforms/Instrumentation/ProfilePaths/ProfilePaths.cpp

index 61c60ec7c5e1e81f0d1df81cdae4647f6b4bb76d..16b07f7c47a0d1febba55b1ff11b27119aef3d39 100644 (file)
@@ -293,7 +293,7 @@ void insertInTopBB(BasicBlock *front,
 //iniArgs.push_back(ConstantSInt::get(Type::IntTy, k));
 //new CallInst(inCountMth, iniArgs, "", here);
   
-
+/*
   if(front->getParent()->getName() == "main"){
     //intialize threshold
     vector<const Type*> initialize_args;
@@ -309,6 +309,7 @@ void insertInTopBB(BasicBlock *front,
   
     new CallInst(initialMeth, trargs, "", here);
   }
+*/
 }
 
 
index 79b94e8755ccb9d1733994b349dcc1ec3ba271f3..138f58238a1ea2af1434a10f2d895d77405a1247 100644 (file)
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/iMemory.h"
+#include "llvm/iOperators.h"
+#include "llvm/iOther.h"
 #include "llvm/Module.h"
 #include "Graph.h"
 #include <fstream>
-
+#include <stdio.h>
 using std::vector;
 
 struct ProfilePaths : public FunctionPass {
@@ -61,7 +63,7 @@ static Node *findBB(std::vector<Node *> &st, BasicBlock *BB){
 bool ProfilePaths::runOnFunction(Function &F){
 
   static int mn = -1;
-
+  static int CountCounter = 1;
   if(F.isExternal()) {
     return false;
   }
@@ -157,6 +159,38 @@ bool ProfilePaths::runOnFunction(Function &F){
 
   //if(numPaths<=1) return false;
 
+  static GlobalVariable *threshold = NULL;
+  static bool insertedThreshold = false;
+
+  if(!insertedThreshold){
+    threshold = new GlobalVariable(Type::IntTy, false,
+                                   GlobalValue::ExternalLinkage, 0,
+                                   "reopt_threshold");
+
+    F.getParent()->getGlobalList().push_back(threshold);
+    insertedThreshold = true;
+  }
+
+  assert(threshold && "GlobalVariable threshold not defined!");
+
+
+  if(fr->getParent()->getName() == "main"){
+    //intialize threshold
+    vector<const Type*> initialize_args;
+    initialize_args.push_back(PointerType::get(Type::IntTy));
+    
+    const FunctionType *Fty = FunctionType::get(Type::VoidTy, initialize_args,
+                                                false);
+    Function *initialMeth = fr->getParent()->getParent()->getOrInsertFunction("reoptimizerInitialize", Fty);
+    assert(initialMeth && "Initialize method could not be inserted!");
+    
+    vector<Value *> trargs;
+    trargs.push_back(threshold);
+  
+    new CallInst(initialMeth, trargs, "", fr->begin());
+  }
+
+
   if(numPaths<=1 || numPaths >5000) return false;
   
 #ifdef DEBUG_PATH_PROFILES  
@@ -185,24 +219,15 @@ bool ProfilePaths::runOnFunction(Function &F){
 
   const ArrayType *ATy = ArrayType::get(Type::IntTy, numPaths);
   Constant *initializer =  ConstantArray::get(ATy, arrayInitialize);
+  char tempChar[20];
+  sprintf(tempChar, "Count%d", CountCounter);
+  CountCounter++;
+  std::string countStr = tempChar;
   GlobalVariable *countVar = new GlobalVariable(ATy, false,
                                                 GlobalValue::InternalLinkage, 
-                                                initializer, "Count",
+                                                initializer, countStr,
                                                 F.getParent());
-  static GlobalVariable *threshold = NULL;
-  static bool insertedThreshold = false;
-
-  if(!insertedThreshold){
-    threshold = new GlobalVariable(Type::IntTy, false,
-                                   GlobalValue::ExternalLinkage, 0,
-                                   "reopt_threshold");
-
-    F.getParent()->getGlobalList().push_back(threshold);
-    insertedThreshold = true;
-  }
-
-  assert(threshold && "GlobalVariable threshold not defined!");
-
+  
   // insert initialization code in first (entry) BB
   // this includes initializing r and count
   insertInTopBB(&F.getEntryNode(),numPaths, rVar, threshold);