本文整理汇总了C++中StoreInst::insertAfter方法的典型用法代码示例。如果您正苦于以下问题:C++ StoreInst::insertAfter方法的具体用法?C++ StoreInst::insertAfter怎么用?C++ StoreInst::insertAfter使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类StoreInst
的用法示例。
在下文中一共展示了StoreInst::insertAfter方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: InsertRootInitializers
bool LowerIntrinsics::InsertRootInitializers(Function &F, AllocaInst **Roots,
unsigned Count) {
// Scroll past alloca instructions.
BasicBlock::iterator IP = F.getEntryBlock().begin();
while (isa<AllocaInst>(IP)) ++IP;
// Search for initializers in the initial BB.
SmallPtrSet<AllocaInst*,16> InitedRoots;
for (; !CouldBecomeSafePoint(IP); ++IP)
if (StoreInst *SI = dyn_cast<StoreInst>(IP))
if (AllocaInst *AI =
dyn_cast<AllocaInst>(SI->getOperand(1)->stripPointerCasts()))
InitedRoots.insert(AI);
// Add root initializers.
bool MadeChange = false;
for (AllocaInst **I = Roots, **E = Roots + Count; I != E; ++I)
if (!InitedRoots.count(*I)) {
StoreInst* SI = new StoreInst(ConstantPointerNull::get(cast<PointerType>(
cast<PointerType>((*I)->getType())->getElementType())),
*I);
SI->insertAfter(*I);
MadeChange = true;
}
return MadeChange;
}
示例2: InsertRootInitializers
bool LowerIntrinsics::InsertRootInitializers(Function &F, Instruction **Roots,
unsigned Count) {
// Scroll past alloca instructions.
BasicBlock::iterator IP = F.getEntryBlock().begin();
while (isa<AllocaInst>(IP)) ++IP;
// Search for initializers in the initial BB.
SmallPtrSet<AllocaInst*,16> InitedRoots;
for (; !CouldBecomeSafePoint(IP); ++IP)
if (StoreInst *SI = dyn_cast<StoreInst>(IP))
if (AllocaInst *AI =
dyn_cast<AllocaInst>(SI->getOperand(1)->stripPointerCasts()))
InitedRoots.insert(AI);
// Add root initializers.
bool MadeChange = false;
for (Instruction **II = Roots, **IE = Roots + Count; II != IE; ++II) {
// Trace back through GEPs to find the actual alloca.
Instruction *I = *II;
while (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I))
I = cast<Instruction>(GEP->getPointerOperand());
AllocaInst *AI = cast<AllocaInst>(I);
if (!InitedRoots.count(AI)) {
Type *ElemTy = cast<PointerType>((*II)->getType())->getElementType();
PointerType *PElemTy = cast<PointerType>(ElemTy);
StoreInst* SI = new StoreInst(ConstantPointerNull::get(PElemTy), *II);
SI->insertAfter(*II);
MadeChange = true;
}
}
return MadeChange;
}
示例3: insertRootInitializers
bool TartGCStrategy::insertRootInitializers(Function & fn, AllocaInst ** roots, unsigned count) {
// Scroll past alloca instructions.
BasicBlock::iterator ip = fn.getEntryBlock().begin();
while (isa<AllocaInst>(ip)) {
++ip;
}
// Search for initializers in the initial BB.
SmallPtrSet<AllocaInst*,16> initedRoots;
for (; !couldBecomeSafePoint(ip); ++ip) {
if (StoreInst * si = dyn_cast<StoreInst>(ip)) {
if (AllocaInst * ai = dyn_cast<AllocaInst>(si->getOperand(1)->stripPointerCasts())) {
initedRoots.insert(ai);
}
}
}
// Add root initializers.
bool madeChange = false;
// Initialize each root to null.
for (AllocaInst ** ai = roots, ** E = roots + count; ai != E; ++ai) {
if (!initedRoots.count(*ai)) {
Type * type = cast<PointerType>((*ai)->getType())->getElementType();
StoreInst * storeInst;
if (PointerType * ptype = dyn_cast<PointerType>(type)) {
storeInst = new StoreInst(ConstantPointerNull::get(ptype), *ai);
} else {
storeInst = new StoreInst(ConstantAggregateZero::get(type), *ai);
}
storeInst->insertAfter(*ai);
madeChange = true;
}
}
return madeChange;
}
示例4: runOnModule
//
// Method: runOnModule()
//
// Description:
// Entry point for this LLVM pass.
// Clone functions that take LoadInsts as arguments
//
// Inputs:
// M - A reference to the LLVM module to transform
//
// Outputs:
// M - The transformed LLVM module.
//
// Return value:
// true - The module was modified.
// false - The module was not modified.
//
bool LoadArgs::runOnModule(Module& M) {
std::map<std::pair<Function*, const Type * > , Function* > fnCache;
bool changed;
do {
changed = false;
for (Module::iterator Func = M.begin(); Func != M.end(); ++Func) {
for (Function::iterator B = Func->begin(), FE = Func->end(); B != FE; ++B) {
for (BasicBlock::iterator I = B->begin(), BE = B->end(); I != BE;) {
CallInst *CI = dyn_cast<CallInst>(I++);
if(!CI)
continue;
if(CI->hasByValArgument())
continue;
// if the CallInst calls a function, that is externally defined,
// or might be changed, ignore this call site.
Function *F = CI->getCalledFunction();
if (!F || (F->isDeclaration() || F->mayBeOverridden()))
continue;
if(F->hasStructRetAttr())
continue;
if(F->isVarArg())
continue;
// find the argument we must replace
Function::arg_iterator ai = F->arg_begin(), ae = F->arg_end();
unsigned argNum = 0;
for(; argNum < CI->getNumArgOperands();argNum++, ++ai) {
// do not care about dead arguments
if(ai->use_empty())
continue;
if(F->getAttributes().getParamAttributes(argNum).hasAttrSomewhere(Attribute::SExt) ||
F->getAttributes().getParamAttributes(argNum).hasAttrSomewhere(Attribute::ZExt))
continue;
if (isa<LoadInst>(CI->getArgOperand(argNum)))
break;
}
// if no argument was a GEP operator to be changed
if(ai == ae)
continue;
LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(argNum));
Instruction * InsertPt = &(Func->getEntryBlock().front());
AllocaInst *NewVal = new AllocaInst(LI->getType(), "",InsertPt);
StoreInst *Copy = new StoreInst(LI, NewVal);
Copy->insertAfter(LI);
/*if(LI->getParent() != CI->getParent())
continue;
// Also check that there is no store after the load.
// TODO: Check if the load/store do not alias.
BasicBlock::iterator bii = LI->getParent()->begin();
Instruction *BII = bii;
while(BII != LI) {
++bii;
BII = bii;
}
while(BII != CI) {
if(isa<StoreInst>(BII))
break;
++bii;
BII = bii;
}
if(isa<StoreInst>(bii)){
continue;
}*/
// Construct the new Type
// Appends the struct Type at the beginning
std::vector<Type*>TP;
for(unsigned c = 0; c < CI->getNumArgOperands();c++) {
if(c == argNum)
TP.push_back(LI->getPointerOperand()->getType());
TP.push_back(CI->getArgOperand(c)->getType());
}
//return type is same as that of original instruction
FunctionType *NewFTy = FunctionType::get(CI->getType(), TP, false);
numSimplified++;
//if(numSimplified > 1000)
//return true;
//.........这里部分代码省略.........