应该如何清理 LLVM 函数克隆?

How should LLVM Function clones be cleaned up?

我有一个 LLVM pass,它遍历输入 IR 代码并对调用的函数执行分析。我的分析函数签名是 functionTracer(const Function* pFunc),我在 CallInstgetCalledFunction() 上调用它。

在我的分析函数开始时,我创建了一个我在分析过程中操作的传入函数的副本:

Function* pFunctionToAnalyze = CloneFunction(pFunction,VMap,false); 

我有一个调用函数的 C++ main f2(int i):

int main(){
    int a = 3;
    int b = f2(a);
    int c = f2(b);
}

我把这个code转成IR,提交到我的pass。我的代码似乎执行并执行了我想要的操作,但我得到以下错误输出:

While deleting: i32 (i32)* %_Z2f2i
Use still stuck around after Def is destroyed:  %call1 = call i32 @_Z2f2i(i32 %1)
Use still stuck around after Def is destroyed:  %call = call i32 @_Z2f2i(i32 %0)
module: /home/src/extern/llvm/llvm-3.7.0.src/lib/IR/Value.cpp:82: 
virtual llvm::Value::~Value(): Assertion `use_empty() && "Uses remain when a value is destroyed!"' failed.
Aborted (core dumped)

我是否需要在分析函数结束时手动清理 Cloned 函数 pFunctionToAnalyze,以便在返回之前删除 Uses?有没有更好的方法复制函数内容进行分析可能会修改?

在 lib/Transforms/IPO/PartialInlining.cpp

中有一个例子
  // Clone the function, so that we can hack away on it.
  ValueToValueMapTy VMap;
  Function* duplicateFunction = CloneFunction(F, VMap,
                                              /*ModuleLevelChanges=*/false);

最后传球:

duplicateFunction->replaceAllUsesWith(F);
duplicateFunction->eraseFromParent();

这不是解决您的问题的方法吗?