我想在llvm IR文件中插入一个load语句

时间:2014-02-13 10:36:58

标签: insert llvm

我有像以下的IR代码:

%0 = load i32* %b, align 4
%mul = mul nsw i32 %0, 1

我想用加载替换第二条指令:%mul = load i32* %0, align4

所以我使用以下代码:

new LoadInst(op1, "mul", x);

其中x是指向我想要替换的指令的指针(指令*), 值* op1 = x-> getOperand(0);

在x之前插入该指令后,我擦除x(当前指令)。当我运行它时,我在这里得到错误。我觉得我没有传递正确的论据。

PS:我不允许使用实用程序类进行更改。

1 个答案:

答案 0 :(得分:0)

你正在做的事情有两个问题。

首先,如果这是您的目标代码,则属于非法行为:

%0 = load i32* %b, align 4
%mul = load i32* %0, align 4

由于%0的类型为i32,但在加载中,您认为它是i32*

第二,将一条指令替换为另一条指令的正确方法是use ReplaceInstWithInst(在BasicBlockUtils.h),因为它还会更新旧指令的所有用户以使用新指令。

为了澄清你的方式不起作用的原因,这是一个演示(忽略类型问题):

%0 = load i32* %b, align 4
%mul = mul nsw i32 %0, 1
ret i32 %mul

现在您运行new LoadInst(op1, "mul", x);并获取:

%0 = load i32* %b, align 4
%mul = load i32* %0, align 4
%mul.1 = mul nsw i32 %0, 1
ret i32 %mul.1

为什么我要将第二条指令从%mul重命名为%mul.1?我没有;两者都命名为%mul。但是当你打印出来时,打印机会将.<serial number>附加到所有共享相同范围和名称的指令,以防止混淆。

无需添加,删除后即可获得:

%0 = load i32* %b, align 4
%mul = load i32* %0, align 4
ret i32 %mul.1

ret指的是缺失值。

简而言之,你不能依赖于指令名称,它只是帮助调试并使IR的文本表示更具可读性。