我想实现一个函数f,它的唯一参数是指向2 int向量的指针,并返回向量的第二个元素。那是f :: <2 * i32> * --> int
。
我认为它应该生成如下代码:
getelementptr i32, <2 x i32>* %a, i32 1
我正在使用LLVM C API,我无法管理它以生成上面的代码。我发现LLVMBuildGEP
已实现为wrap(unwrap(B)->CreateGEP(nullptr, unwrap(Pointer), IdxList, Name));
。如果我们使用LLVM C API,是否只能将nullptr传递给CreateGEP
?
如何使用LLVM C API生成上述代码?
非常感谢。
答案 0 :(得分:0)
这 http://llvm.org/doxygen/IR_2Core_8cpp_source.html core.cpp:2897
LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
LLVMValueRef *Indices, unsigned NumIndices,
const char *Name) {
ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
return wrap(unwrap(B)->CreateGEP(nullptr, unwrap(Pointer), IdxList, Name));
}
如果您使用的是LLVMBuildGEP(C-API),则需要传递BuilderRef,Pointer(指向您的向量的指针),Indices(在您的情况下是i32 1),Numindices(也是一个)和名称。 core.cpp中的代码是一个包装器,它打开C-API调用并调用c ++调用。
现在说了。 我强烈反对使用GEP进行向量元素提取。它会导致某些组合(个人体验)的优化出现问题。 您可以使用extractelement(LLVMBuildExtractElement C-interface)来提取vector元素。
如果您有兴趣,可以在此处详细了解GEP。https://llvm.org/docs/LangRef.html#extractelement-instruction
并在此处完成C-interface列表http://llvm.org/doxygen/group__LLVMCCoreInstructionBuilder.html#gaf392c575dd594d83894d3e71a520ffa4
P.S.:不确定以上链接是否更新。