我正在使用LLVM来获取商店指令并将其替换为另一个指令,以便我可以采取类似的方式
store i64 %0, i64* %a
并将其替换为
store i64 <value>, i64* %a
我用过
llvm::Value *str = i->getOperand(1);
获取我的旧指令正在使用的地址,然后我创建一个新的商店(我是当前的指令位置,所以这个商店将在我正在更换的商店之前创建)
StoreInstr *store = new StoreInst(value, str, i);
然后我删除了我用
替换的商店i->eraseFromParent();
但是我收到了错误: 删除时:i64% 在销毁Def后仍然使用:存储i64,i64 *%a 以及断言“使用空”&amp;&amp;当值被销毁失败时,使用保留。
我怎么能绕过这个?我想创建一个存储指令然后使用LLVM的ReplaceInstWithInst,但我找不到一种方法来创建存储指令而不给它一个插入自己的位置。我也不是100%会解决我的问题。
我会在我的商店更换之前添加,我匹配一条指令i,然后在执行i-&gt; eraseFromParent之前得到我需要的值,所以我不确定这是否是我问题的一部分;我假设eraseFromParent将i移动到以下存储指令。
答案 0 :(得分:1)
eraseFromParent
从封闭的基本块中删除一条指令(因此,从封闭的函数中删除)。它不会移动到任何地方。以这种方式擦除指令而不首先处理它的使用将使您的IR格式不正确,这就是您收到错误的原因 - 就好像您从以下C片段中删除了第1行:
1 int x = 3;
2 int y = x + 1;
显然你会在剩下的行上出错,x
的定义现在已经丢失了!
ReplaceInstWithInst
可能是将一条指令替换为另一条指令的最佳方法。您不需要为新指令提供插入位置:只需将指令保留为NULL(或者更好,省略参数),它将创建一个悬空指令,然后您可以将其放置在任何您想要的位置。 / p>
由于上述原因,顺便说一下,ReplaceInstWithInst
调用的关键方法是Value::replaceAllUsesWith
,这可以确保您不会在IR中留下缺失值。