我有像以下的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:我不允许使用实用程序类进行更改。
答案 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的文本表示更具可读性。