我有以下指示:
%ptrA = getelementptr float, float addrspace(1)* %A, i32 %id
我可以使用%A
和%id
获取操作数getOperand(0)
和getOperand(1)
。我想知道getOperand
是否适用于%ptrA
?如果是,那会是getOperand(3)
吗?
------------------------------------编辑---------- ------------------
所以我改变了我的代码如下:
for (Instruction &I : instructions(F)){
if (cast<Operator>(I).getOpcode() == Instruction::GetElementPtr){
Value* AddrPointer = cast<Value>(I);
我一直收到错误:
error: cannot convert ‘llvm::Value’ to ‘llvm::Value*’ in initialization
Value* AddrPointer = cast<Value>(I);
^
我发现类型不匹配存在一些问题。
谢谢。
答案 0 :(得分:3)
你的问题缺乏相当多的背景,但我假设你正在使用代表特定llvm::Instruction *
指令的getelementptr
。不,getOperand()
将不允许您访问%ptrA
。通常,getOperand()
仅允许访问指令的操作数或参数,但不允许访问其返回值。在IR中,%ptrA
并不像传统汇编那样是指令的操作数,但可以被认为更像是指令的返回值。
您尝试做的语法实际上非常方便。 llvm::Instruction
对象本身表示自己的返回值。实际上,llvm::Instruction
是llvm::Value
的派生类。您可以使用llvm::cast
,llvm::Value
作为模板参数,结果实际上是llvm::Value *
,表示getelementptr
的返回值。
llvm::Instruction * instruc;
//next line assumes instruc has your getelementptr instruction
llvm::Value * returnval = llvm::cast<llvm::Value>(instruc);
//returnval now contains the result of the instruction
//you could potentially create new instructions with IRBuilder using returnval as an argument, and %ptrA would actually be passed as an operand to those instructions
此外,许多实际创建指令的函数(例如llvm::IRBuilder::Create*
指令)甚至不返回llvm::Instruction *
,而是返回llvm::Value *
s。这非常方便,因为大多数情况下,如果您需要将指令的返回值提供给另一个指令,您可以简单地将您调用的Create
函数的返回值传递给下一个Create
功能,无需任何铸造。