如何添加受限浮点数内联函数

警告

此内容尚在开发中。

添加内联函数

添加新的受限内联函数需要更新多个文件。

将新的内联函数添加到内联函数表中

include/llvm/IR/Intrinsics.td

添加 SelectionDAG 节点类型

将节点类型的新的 STRICT 版本添加到 ISD::NodeType 枚举中

include/llvm/CodeGen/ISDOpcodes.h

严格版本名称必须是前缀 STRICT_ 和相应非严格节点名称的串联。例如,节点 FADD 的严格版本必须是 STRICT_FADD。

更新映射

在指令到受限内联函数和 DAG 节点的映射中添加新的记录

include/llvm/IR/ConstrainedOps.def

按照此文件中提供的说明操作。

更新 IR 组件

更新 IR 验证器

lib/IR/Verifier.cpp

更新选择器组件

构建 SelectionDAG

函数 SelectionDAGBuilder::visitConstrainedFPIntrinsic 使用 ConstrainedOps.def 中指定的映射构建 DAG 节点。但是,如果此默认构建不足,则可以修改构建,请参阅 STRICT_FP_ROUND 的实现方式。新的 STRICT 节点最终将转换为匹配的非 STRICT 节点。因此,它应该与非 STRICT 版本具有相同的操作数和值,但还应使用链。这使得后续为 STRICT 和非 STRICT 代码路径共享代码变得更容易

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

大多数 STRICT 节点与其匹配的非 STRICT 对应节点的合法化方式相同。具有此属性的新 STRICT 节点必须添加到 SelectionDAGLegalize::LegalizeOp() 中的 switch 语句中。

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

合法化器的其他部分可能也需要更新。查找对非 STRICT 对应节点进行合法化的地方,并根据需要进行更新。注意链,因为 STRICT 节点使用它,但其对应节点通常不使用。

将 STRICT 节点转换为非 STRICT 版本节点的代码位于 SelectionDAG::mutateStrictFPToFP() 中。在大多数情况下,该函数可以使用 ConstrainedOps.def 中的信息进行转换。更新此函数时要小心,因为某些节点的返回类型与其输入操作数相同,而某些则不同。这两种情况都必须正确处理

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

是否可能发生转换取决于新节点在 TargetLoweringBase::initActions() 中的注册方式。默认情况下,所有严格节点都注册为 Expand 操作

lib/CodeGen/TargetLoweringBase.cpp

为了使调试日志易于阅读,更新 SelectionDAG 的调试记录器很有帮助:

lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp

添加文档和测试

docs/LangRef.rst