From 2fd8edd659d705538e7bc716dd67b687b8ba54fa Mon Sep 17 00:00:00 2001 From: Anand Shukla Date: Thu, 5 Jun 2003 06:02:46 +0000 Subject: [PATCH] Fixed a bug so initialization code is always inserted in main llvm-svn: 6622 --- .../Instrumentation/ProfilePaths/EdgeCode.cpp | 3 +- .../ProfilePaths/ProfilePaths.cpp | 59 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/ProfilePaths/EdgeCode.cpp b/llvm/lib/Transforms/Instrumentation/ProfilePaths/EdgeCode.cpp index 61c60ec7c5e1..16b07f7c47a0 100644 --- a/llvm/lib/Transforms/Instrumentation/ProfilePaths/EdgeCode.cpp +++ b/llvm/lib/Transforms/Instrumentation/ProfilePaths/EdgeCode.cpp @@ -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 initialize_args; @@ -309,6 +309,7 @@ void insertInTopBB(BasicBlock *front, new CallInst(initialMeth, trargs, "", here); } +*/ } diff --git a/llvm/lib/Transforms/Instrumentation/ProfilePaths/ProfilePaths.cpp b/llvm/lib/Transforms/Instrumentation/ProfilePaths/ProfilePaths.cpp index 79b94e8755cc..138f58238a1e 100644 --- a/llvm/lib/Transforms/Instrumentation/ProfilePaths/ProfilePaths.cpp +++ b/llvm/lib/Transforms/Instrumentation/ProfilePaths/ProfilePaths.cpp @@ -29,10 +29,12 @@ #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 - +#include using std::vector; struct ProfilePaths : public FunctionPass { @@ -61,7 +63,7 @@ static Node *findBB(std::vector &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 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 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);