微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

llvm::VectorType 大小来自运行时常量

如何解决llvm::VectorType 大小来自运行时常量

问题

我正在尝试在 LLVM(版本 12)中创建一个向量类型,以利用与此类型关联的 SIMD 功能。但是,所需的数组大小存储在整数变量中。所需的 LLVM IR 代码可能如下所示,

;; Pseudo-code for the desired LLVM IR
%0 = load i64,i64* %a
%vec = alloca <%0 x double>,align 16 

不过,生成这样的 IR 代码似乎是不可能的。 可以使用编译时常量生成向量 alloca,例如大小为 4 的向量可以生成

%vec = alloca <4 x double>,align 16

使用 LLVM C++ API

llvm::Type* I = llvm::Type::getDoubleTy(TheContext);
auto arr_type = llvm::VectorType::get(I,4,false); 
llvm::AllocaInst* arr_alloc = Builder.Createalloca(arr_type,"vec" ); 

然而,使用从变量获得的运行时常量似乎是一个问题,因为 llvm::VectorType::get 接口只允许将大小指定为无符号整数。 IE。可用的界面看起来像

static VectorType* llvm::VectorType::get    (   Type *  ElementType,unsigned    NumElements,bool    scalable 
)   

但是,如果我从 %a 加载变量值并且我不能使用它创建一个向量类型,

llvm::Value *SIZE = Builder.CreateLoad(IntType,Address_Of_Variable_A,"a");
auto arr_type = llvm::VectorType::get(I,SIZE,false); // this line fails to compile (since SIZE is not an unsigned int)

我也无法将 Value* 指针类型转换为 llvm::ConstantInt* 指针以从 Value* 取回整数值,如 https://stackoverflow.com/a/5315581/2940917 中所做的那样。 发生这种情况是因为 SIZE 在这种情况下是 LoadInst*,而不是像链接问题中那样从 ConstantInt::get 创建。

有没有办法做到这一点?在许多情况下,这似乎是一项必不可少的操作。如果无法从运行时常量中声明向量大小,那将是令人惊讶的。

有人能给我指出正确的信息来源/想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。