如何在 LLVM IR 中初始化常量向量?
How do I initialize a constant vector in LLVM IR?
我正在尝试使用 LLVM IR 作为起点来初始化一个常量向量,以熟悉各种目标支持的向量操作。我定义了以下简单的主要功能:
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.31.31104"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i64 @main() #0 {
%one = <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%i = bitcast <8 x i8> %one to i64
ret i64 %i
}
%one = <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
行给出了来自 clang 13.0.1 的编译错误:
error: expected instruction opcode
%one = <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
^
不知道问题出在哪里,因为 example for the freeze instruction 中的文档列出了以下代码:
; example with vectors
%v = <2 x i32> <i32 undef, i32 poison>
%a = extractelement <2 x i32> %v, i32 0 ; undef
%b = extractelement <2 x i32> %v, i32 1 ; poison
%add = add i32 %a, %a ; undef
这似乎使用与我正在使用的矢量初始化相同的格式。我也尝试在 = 符号后添加 constant 但这会产生相同的错误。 vector types 的文档也描述了使用这种格式的常量。作为参考,我在 clang 中使用了以下命令行参数:
clang test.ll -o test.exe
知道为什么 clang 难以理解这段代码吗?我不知道它期望的操作码是什么。
常量文字不能赋值给变量,必须直接指定:
%i = bitcast <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> to i64
您可以通过将常量包装在虚拟操作中来“分配”常量:
%one = add <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, zeroinitializer
我正在尝试使用 LLVM IR 作为起点来初始化一个常量向量,以熟悉各种目标支持的向量操作。我定义了以下简单的主要功能:
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.31.31104"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i64 @main() #0 {
%one = <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%i = bitcast <8 x i8> %one to i64
ret i64 %i
}
%one = <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
行给出了来自 clang 13.0.1 的编译错误:
error: expected instruction opcode
%one = <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
^
不知道问题出在哪里,因为 example for the freeze instruction 中的文档列出了以下代码:
; example with vectors
%v = <2 x i32> <i32 undef, i32 poison>
%a = extractelement <2 x i32> %v, i32 0 ; undef
%b = extractelement <2 x i32> %v, i32 1 ; poison
%add = add i32 %a, %a ; undef
这似乎使用与我正在使用的矢量初始化相同的格式。我也尝试在 = 符号后添加 constant 但这会产生相同的错误。 vector types 的文档也描述了使用这种格式的常量。作为参考,我在 clang 中使用了以下命令行参数:
clang test.ll -o test.exe
知道为什么 clang 难以理解这段代码吗?我不知道它期望的操作码是什么。
常量文字不能赋值给变量,必须直接指定:
%i = bitcast <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> to i64
您可以通过将常量包装在虚拟操作中来“分配”常量:
%one = add <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, zeroinitializer