如何添加受限浮点数内联函数¶
警告
此内容尚在开发中。
添加内联函数¶
添加新的受限内联函数需要更新多个文件。
将新的内联函数添加到内联函数表中
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