llvm libLLVMCore源码分析 12 - Vector & Aggregate Operations

本文详细介绍了LLVM IR中的三种向量操作指令:ExtractElementInst用于从向量中提取指定索引的元素,InsertElementInst用于将元素插入向量的特定位置,而ShuffleVectorInst则根据掩码从两个向量中混合元素创建新向量。每个指令的语法、参数和语义都进行了清晰的解释,并提供了使用示例。

源码路径

llvm\include\llvm\IR\Instruction.h

llvm\include\llvm\IR\Instruction.def

llvm\include\llvm\IR\Instructions.h

llvm\include\llvm\IR\InstrTypes.h

Vector Operations

ExtractElementInst(父类:Instruction)

extractelement指令从vector从取出指定索引位置的标量。

语法

<result> = extractelement <n x <ty>> <val>, <ty2> <idx>  ; yields <ty>
<result> = extractelement <vscale x n x <ty>> <val>, <ty2> <idx> ; yields <ty>

参数说明:

ty:vector中的元素类型

ty2:索引的类型,必须是整型。

语义

extractelement指令从vector从取出idx位置的标量。如果idx超过了vector的长度,则result为Poison Value。

示例

<result> = extractelement <4 x i32> %vec, i32 0    ; yields i32

InsertElementInst(父类:Instruction)

insertelement指令将标量插入vector的指定位置。

语法

<result> = insertelement <n x <ty>> <val>, <ty> <elt>, <ty2> <idx>    ; yields <n x <ty>>
<result> = insertelement <vscale x n x <ty>> <val>, <ty> <elt>, <ty2> <idx> ; yields <vscale x n x <ty>>

参数说明:

ty:vector中的元素类型

ty2:索引的类型,必须是整型。

语义

insertelement指令将标量插入vector中idx指定的位置。如果idx超过了vector的长度,则result为Poison Value。

示例

<result> = insertelement <4 x i32> %vec, i32 1, i32 0    ; yields <4 x i32>

ShuffleVectorInst(父类:Instruction)

shufflevector指令从输入的两个vector中,按照mask的指示抽取元素组成一个新的vector。

语法

<result> = shufflevector <n x <ty>> <v1>, <n x <ty>> <v2>, <m x i32> <mask>    ; yields <m x <ty>>
<result> = shufflevector <vscale x n x <ty>> <v1>, <vscale x n x <ty>> v2, <vscale x m x i32> <mask>  ; yields <vscale x m x <ty>>

参数说明:

mask:元素必须为常量整数或者Undef Value。

语义

shufflevector指令先将两个输入的Vector从左到右顺序排列成一个Shuffle Vector,接着顺序选择mask中的元素作为idx,抽取Shuffle Vector中idx位置的元素,作为result vector idx位置的元素。

示例

<result> = shufflevector <4 x i32> %v1, <4 x i32> %v2,
                        <4 x i32> <i32 0, i32 4, i32 1, i32 5>  ; yields <4 x i32>
<result> = shufflevector <4 x i32> %v1, <4 x i32> undef,
                        <4 x i32> <i32 0, i32 1, i32 2, i32 3>  ; yields <4 x i32> - Identity shuffle.
<result> = shufflevector <8 x i32> %v1, <8 x i32> undef,
                        <4 x i32> <i32 0, i32 1, i32 2, i32 3>  ; yields <4 x i32>
<result> = shufflevector <4 x i32> %v1, <4 x i32> %v2,
                        <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7 >  ; yields <8 x i32>

Aggregate Operations

ExtractValueInst(父类:UnaryInstruction)

extractvalue指令从聚合类型中取出成员字段的值。

语法

<result> = extractvalue <aggregate type> <val>, <idx>{, <idx>}*

参数说明:

aggregate type:必须是struct或者array类型。

idx:整型常数。

语义

extractvalue指令从聚合类型val中取出idx位置成员字段的类型和值,作为result的类型和值。

示例

<result> = extractvalue {i32, float} %agg, 0    ; yields i32

InsertValueInst(父类:Instruction)

insertvalue指令将一个值插入到指定的聚合类型成员字段。

语法

<result> = insertvalue <aggregate type> <val>, <ty> <elt>, <idx>{, <idx>}*    ; yields <aggregate type>

参数说明:

aggregate type:必须是struct或者array类型。

ty:成员的类型,必须和aggregate type在idx处的成员类型相同。

idx:整型常数。

语义

insertvalue指令将elt插入到idx指定的聚合类型val成员字段,并返回val。

示例

%agg1 = insertvalue {i32, float} undef, i32 1, 0              ; yields {i32 1, float undef}
%agg2 = insertvalue {i32, float} %agg1, float %val, 1         ; yields {i32 1, float %val}
%agg3 = insertvalue {i32, {float}} undef, float %val, 1, 0    ; yields {i32 undef, {float %val}}

### 配置 LLVM 源码构建环境 要在 E 盘 `tvm_llvm` 文件夹下使用 CMake 配置 `llvm-project-llvmorg-11.0.1` 的源码并构建环境,可以按照以下方法操作: #### 准备工作 确保已安装必要的工具链,包括 CMake 和支持的编译器(如 MSVC 或 GCC)。此外,确认已经下载了完整的 LLVM 源码包。 #### 创建构建目录 为了保持源码目录整洁,建议在源码根目录外创建单独的构建目录。假设目标路径为 `E:\tvm_llvm\llvm-build`,可以通过以下命令创建该目录: ```bash mkdir E:\tvm_llvm\llvm-build cd E:\tvm_llvm\llvm-build ``` #### 调用 CMake 进行配置 运行 CMake 命令来生成项目文件。以下是典型的 CMake 调用方式: ```bash cmake -G &quot;Ninja&quot; ^ -DCMAKE_BUILD_TYPE=Release ^ -DLLVM_ENABLE_PROJECTS=&quot;clang;lld&quot; ^ -DLLVM_TARGETS_TO_BUILD=&quot;X86&quot; ^ F:\tools\llvm-project-llvmorg-11.0.1\llvm ``` 上述命令中的参数解释如下: - `-G &quot;Ninja&quot;`:指定生成器为 Ninja 构建系统[^1]。 - `-DCMAKE_BUILD_TYPE=Release`:设置构建模式为 Release 版本[^2]。 - `-DLLVM_ENABLE_PROJECTS=&quot;clang;lld&quot;`:启用 Clang 编译器和 LLD 链接器子项目。 - `-DLLVM_TARGETS_TO_BUILD=&quot;X86&quot;`:仅为目标架构 X86 生成代码。 - `F:\tools\llvm-project-llvmorg-11.0.1\llvm`:LLVM 源码根目录位置。 如果希望使用 Visual Studio 解决方案而不是 Ninja,则可替换生成器选项为: ```bash cmake -G &quot;Visual Studio 16 2019&quot; ... ``` #### 开始构建过程 一旦成功配置完毕,即可启动实际的构建流程。对于 Ninja 用户而言,只需简单输入: ```bash ninja ``` 而对于采用 Visual Studio 的开发者来说,则需打开生成的工作区文件并通过 IDE 执行构建任务。 最终,在完成整个编译周期之后,预期可以在指定输出路径找到所需的二进制成果物 llvm-config.exe。 --- ### 示例 Python 安装脚本 当 LLVM 已经被正确部署后,继续处理 TVM 的安装部分可能涉及类似的指令集。例如下面展示了一个标准的 Python 设定程序调用实例: ```python import os os.chdir(&#39;E:\\tvm_llvm\\tvm\\python&#39;) exec(open(&quot;setup.py&quot;).read(), {&#39;__name__&#39;: &#39;__main__&#39;}) ``` 此段代码实现了切换至特定目录以及执行其中定义好的 setup.py 文件逻辑的功能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值