blob: a6acb6b5153668dea4998501c52113517dbcd725 [file] [log] [blame]
Kevin P. Neal339594e2019-04-11 17:16:03 +00001==================================================
2How To Add A Constrained Floating-Point Intrinsic
3==================================================
4
5.. contents::
6 :local:
7
8.. warning::
9 This is a work in progress.
10
11Add the intrinsic
12=================
13
14Multiple files need to be updated when adding a new constrained intrinsic.
15
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070016Add the new intrinsic to the table of intrinsics::
Kevin P. Neal339594e2019-04-11 17:16:03 +000017
18 include/llvm/IR/Intrinsics.td
19
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070020Add SelectionDAG node types
21===========================
Kevin P. Neal339594e2019-04-11 17:16:03 +000022
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070023Add the new STRICT version of the node type to the ISD::NodeType enum::
Kevin P. Neal339594e2019-04-11 17:16:03 +000024
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070025 include/llvm/CodeGen/ISDOpcodes.h
Kevin P. Neal339594e2019-04-11 17:16:03 +000026
Fangrui Song7d9803192019-11-19 23:09:07 -080027Strict version name must be a concatenation of prefix ``STRICT_`` and the name
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070028of corresponding non-strict node name. For instance, strict version of the
29node FADD must be STRICT_FADD.
30
31Update mappings
32===============
33
34Add new record to the mapping of instructions to constrained intrinsic and
35DAG nodes::
36
37 include/llvm/IR/ConstrainedOps.def
38
39Follow instructions provided in this file.
40
41Update IR components
42====================
Kevin P. Neal339594e2019-04-11 17:16:03 +000043
44Update the IR verifier::
45
46 lib/IR/Verifier.cpp
47
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070048Update Selector components
49==========================
Kevin P. Neal339594e2019-04-11 17:16:03 +000050
51Building the SelectionDAG
52-------------------------
53
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070054The function SelectionDAGBuilder::visitConstrainedFPIntrinsic builds DAG nodes
55using mappings specified in ConstrainedOps.def. If however this default build is
56not sufficient, the build can be modified, see how it is implemented for
57STRICT_FP_ROUND. The new STRICT node will eventually be converted
Kevin P. Neal339594e2019-04-11 17:16:03 +000058to the matching non-STRICT node. For this reason it should have the same
59operands and values as the non-STRICT version but should also use the chain.
60This makes subsequent sharing of code for STRICT and non-STRICT code paths
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070061easier::
Kevin P. Neal339594e2019-04-11 17:16:03 +000062
63 lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
64
65Most of the STRICT nodes get legalized the same as their matching non-STRICT
66counterparts. A new STRICT node with this property must get added to the
67switch in SelectionDAGLegalize::LegalizeOp().::
68
69 lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
70
71Other parts of the legalizer may need to be updated as well. Look for
72places where the non-STRICT counterpart is legalized and update as needed.
73Be careful of the chain since STRICT nodes use it but their counterparts
Zachary Turner528b01e2019-04-11 17:30:03 +000074often don't.
Kevin P. Neal339594e2019-04-11 17:16:03 +000075
76The code to do the conversion or mutation of the STRICT node to a non-STRICT
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070077version of the node happens in SelectionDAG::mutateStrictFPToFP(). In most cases
78the function can do the conversion using information from ConstrainedOps.def. Be
Kevin P. Neal339594e2019-04-11 17:16:03 +000079careful updating this function since some nodes have the same return type
80as their input operand, but some are different. Both of these cases must
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070081be properly handled::
Kevin P. Neal339594e2019-04-11 17:16:03 +000082
83 lib/CodeGen/SelectionDAG/SelectionDAG.cpp
84
Serge Pavlov0c50c0b2019-11-05 20:42:16 +070085Whether the mutation may happens or not, depends on how the new node has been
86registered in TargetLoweringBase::initActions(). By default all strict nodes are
87registered with Expand action::
Kevin P. Neald0f96be2019-06-25 16:09:39 +000088
89 lib/CodeGen/TargetLoweringBase.cpp
90
Kevin P. Neal339594e2019-04-11 17:16:03 +000091To make debug logs readable it is helpful to update the SelectionDAG's
92debug logger:::
93
94 lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
95
96Add documentation and tests
97===========================
98
99::
100
101 docs/LangRef.rst