如何修改此IR中的操作数

问题描述 投票:0回答:1

%1 = 加载 i32, i32* getelementptr 入站 (%struct.A, %struct.A* @g_a, i64 0, i32 1, i32 2), 对齐 4, !tbaa !10 我想将号码从 i64 0, i32 1, i32 2 更改为 i64 0, i32 0, i32 1

首先我从“%1 = load i32, i32* getelementptr inbounds (%struct.A, %struct.A* @g_a, i64 0, i32 1, i32 2) 得到操作数“i32* getelementptr inbounds...” ,对齐 4,!tbaa!10" 然后我尝试将其 dyn_cast 到 GEP,但如果失败。 “const GetElementPtrInst *gep = dyn_cast(op);”
gep 等于 Nullptr。所以我无法让 gep 修改该值。 那么该如何处理呢?

llvm
1个回答
0
投票

这是一条加载指令,其第二个操作数是一个“常量 GEP”,而该指令又具有四个操作数。如果您从代表负载的 Instruction * i 开始,那么

dyn_cast<GetElementPtrConstantExpr>(i->getOperand(1))
将为您提供 GEP。您不能对常量调用 setOperand()(常量的所有用户共享同一个对象),但您可以克隆它并在加载时调用
setOperand(1, yourClonedGep)
我似乎记得有某种方法可以使用相同的代码来处理 GEP 常量和 GEP 指令,但我现在不记得它是什么,而且我担心我没有时间查找它。

© www.soinside.com 2019 - 2024. All rights reserved.