在函数的第一个基本块的第一条指令之前插入加载和存储指令

时间:2016-08-14 05:47:40

标签: llvm

我想在函数的第一个基本块的第一条指令之前插入一个加载和一个存储指令(用于模拟我们工作的性能开销)。 LLVM传递编写如下:

    Value *One = llvm::ConstantInt::get(Type::getInt32Ty(Context),1); 
    for(Function::iterator bb = tmp->begin(); bb != tmp->end(); ++bb        {                                                      
    //for every instruction of the block
    for (BasicBlock::iterator inst = bb->begin(); inst != bb->end(); ++inst){
       if(inst == bb->begin() && bb == tmp->begin()){
           BasicBlock* bp = &*bb;
           Instruction* pinst = &*inst;
           AllocaInst *pa = new AllocaInst(Int32Ty, "buf", pinst);
           StoreInst* newstore = new StoreInst(One, pa, pinst);
           LoadInst* newload = new LoadInst(pa, "loadvalue", pinst);
       }
     }
   }

可以在xx.ll文件中看到插入的加载和存储指令:

    define i32 @fun() #0 {
    entry:
      %buf = alloca i32
      %loadvalue = load i32, i32* %buf
      store i32 %loadvalue, i32* %buf         
      %call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i64 0, i64 0))
      ret i32 1
   }

但是,插入的指令在目标可执行文件中消失了。

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

它们可能是通过优化消除的,因为它们没有任何明显的效果。尝试标记加载并存储为易失性。

通常,您的算法不起作用,因为LLVM期望函数中的所有分配都是第一个指令。您应该扫描第一个基本块并找到第一个非alloca指令并在那里插入新代码,确保首先添加allocas(就像您一样)。