流行网站开发工具,设计在线中国,多少钱可以注册一个公司,介绍网站建设规划书结构llvm后端之DAG设计 引言1 核心类设计2 类型系统2.1 MVT::SimpleValueType2.2 MVT2.3 EVT 3 节点类型 引言
llvm后端将中端的IR转为有向无环图#xff0c;即DAG。如下图#xff1a; 图中黑色箭头为数据依赖#xff1b;蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节… llvm后端之DAG设计 引言1 核心类设计2 类型系统2.1 MVT::SimpleValueType2.2 MVT2.3 EVT 3 节点类型 引言
llvm后端将中端的IR转为有向无环图即DAG。如下图 图中黑色箭头为数据依赖蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节点中间可以插入其他节点对应的指令而红色节点表示两个节点生成的指令中间不能插入其他节点的指令。
注本文参考源码路径为 https://github.com/llvm/llvm-project/tree/release/10.x
1 核心类设计
DAG图是围绕SDNode、SDUse、SDValue组织如下图
DAG图中每个节点用SDNode表示。节点有依赖节点用OperandList表示节点可以有多个输出值其输出值类型用ValueList表示用SDValue表示每个节点的输出值其中记录了SDNode和输出值序号ResNoSDUse表示DAG图的依赖箭头。用Val表示箭头指向的节点即被依赖的节点输出值用User表示箭头起点的节点即使用节点每个SDUse设置Val时会将自己添加到SDNode的UseList链表中。这样每个Node就可以遍历到使用自己的其他节点。
2 类型系统
llvm后端DAG的类型系统分为三个层级从外到内为EVT、MVT、SimpleValueType。如下图
2.1 MVT::SimpleValueType
SimpleValueType是基本数据类型的枚举定义其中包括
整数类型浮点类型向量类型其中包括按类型分类有整数向量和浮点向量按长度分类有固定长度向量和变长向量其他类型
2.2 MVT
MVT是对SimpleValueType值的封装。并提供常规的方法
isValid : 为整数类型、浮点类、向量类型以及x86mmx、Glue、isVoid、Untyped、exnref则为trueisFloatingPoint / isInteger : 整数/浮点及其相应类型的向量为trueisScalarInteger : 非向量的整数类型则为trueisScalableVector : 变长向量则为trueisFixedLengthVector 定长向量则为trueisOverloaded : 可重载类型就是由内置函数可以解释的任意长度类型。有Any、iAny、vAny、fAny、iPTRAnyisPow2VectorType 向量元素个数为2的N次方则为truegetPow2VectorType : 返回元素个数扩展为2的N次方的新向量类型例如16个不扩展5个则扩展为8个getHalfNumVectorElementsVT : 将向量元素个数截断为原来的一半并返回其类型getScalarType : 为向量则返回元素类型否则返回自身相同类型getVectorNumElements : 返回向量元素个数变长向量则返回最小向量元素个数getSizeInBits : 返回类型的bit位数变长向量则返回最小元素个数乘以元素类型的bit数。getScalarSizeInBits : 返回getScalarType类型的bit位数getStoreSize : 返回类型从存储长度即扩展为字节长度。例如1位int扩展为8位intbitsGT / bitsGE / bitsLT / bitsLE : 比较MVT的getSizeInBits值
此外还提供了根据bit位返回类型的系列静态方法。
2.3 EVT
EVT是对MVT的封装此外还提供了对MVT类型的扩展。当表示MVT之外的类型时其V.SimpleTy为INVALID_SIMPLE_VALUE_TYPE。例如当定义一个1024位的int此时就是一个扩展类型。
3 节点类型
DAG节点的类型(也就是操作类型对应于指令类型)是定义在llvm::ISD::NodeType枚举类型中此外可以基于BUILTIN_OP_END往后自定义目标的操作类型。llvm::ISD::NodeType的节点类型包括