File: AddingConstrainedIntrinsics.html

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-6~deb10u4
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,418,792 kB
  • sloc: cpp: 5,290,827; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,900; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,892; xml: 953; cs: 573; fortran: 539
file content (247 lines) | stat: -rw-r--r-- 13,899 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247


<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>How To Add A Constrained Floating-Point Intrinsic &#8212; LLVM 13 documentation</title>
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/llvm-theme.css" type="text/css" />
    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Advanced Build Configurations" href="AdvancedBuilds.html" />
    <link rel="prev" title="User Guides" href="UserGuides.html" />
<style type="text/css">
  table.right { float: right; margin-left: 20px; }
  table.right td { border: 1px solid #ccc; }
</style>

  </head><body>
<div class="logo">
  <a href="index.html">
    <img src="_static/logo.png"
         alt="LLVM Logo" width="250" height="88"/></a>
</div>

    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="AdvancedBuilds.html" title="Advanced Build Configurations"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="UserGuides.html" title="User Guides"
             accesskey="P">previous</a> |</li>
  <li><a href="https://llvm.org/">LLVM Home</a>&nbsp;|&nbsp;</li>
  <li><a href="index.html">Documentation</a>&raquo;</li>

          <li class="nav-item nav-item-1"><a href="UserGuides.html" accesskey="U">User Guides</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">How To Add A Constrained Floating-Point Intrinsic</a></li> 
      </ul>
    </div>

      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">

<h3>Documentation</h3>

<ul class="want-points">
    <li><a href="https://llvm.org/docs/GettingStartedTutorials.html">Getting Started/Tutorials</a></li>
    <li><a href="https://llvm.org/docs/UserGuides.html">User Guides</a></li>
    <li><a href="https://llvm.org/docs/Reference.html">Reference</a></li>
</ul>

<h3>Getting Involved</h3>

<ul class="want-points">
    <li><a href="https://llvm.org/docs/Contributing.html">Contributing to LLVM</a></li>
    <li><a href="https://llvm.org/docs/HowToSubmitABug.html">Submitting Bug Reports</a></li>
    <li><a href="https://llvm.org/docs/GettingInvolved.html#mailing-lists">Mailing Lists</a></li>
    <li><a href="https://llvm.org/docs/GettingInvolved.html#irc">IRC</a></li>
    <li><a href="https://llvm.org/docs/GettingInvolved.html#meetups-and-social-events">Meetups and Social Events</a></li>
</ul>

<h3>Additional Links</h3>

<ul class="want-points">
    <li><a href="https://llvm.org/docs/FAQ.html">FAQ</a></li>
    <li><a href="https://llvm.org/docs/Lexicon.html">Glossary</a></li>
    <li><a href="https://llvm.org/pubs">Publications</a></li>
    <li><a href="https://github.com/llvm/llvm-project//">Github Repository</a></li>
</ul>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="_sources/AddingConstrainedIntrinsics.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
<div id="searchbox" style="display: none" role="search">
  <h3 id="searchlabel">Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" aria-labelledby="searchlabel" />
      <input type="submit" value="Go" />
    </form>
    </div>
</div>
<script>$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <div class="section" id="how-to-add-a-constrained-floating-point-intrinsic">
<h1>How To Add A Constrained Floating-Point Intrinsic<a class="headerlink" href="#how-to-add-a-constrained-floating-point-intrinsic" title="Permalink to this headline">¶</a></h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#add-the-intrinsic" id="id1">Add the intrinsic</a></p></li>
<li><p><a class="reference internal" href="#add-selectiondag-node-types" id="id2">Add SelectionDAG node types</a></p></li>
<li><p><a class="reference internal" href="#update-mappings" id="id3">Update mappings</a></p></li>
<li><p><a class="reference internal" href="#update-ir-components" id="id4">Update IR components</a></p></li>
<li><p><a class="reference internal" href="#update-selector-components" id="id5">Update Selector components</a></p>
<ul>
<li><p><a class="reference internal" href="#building-the-selectiondag" id="id6">Building the SelectionDAG</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="#add-documentation-and-tests" id="id7">Add documentation and tests</a></p></li>
</ul>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>This is a work in progress.</p>
</div>
<div class="section" id="add-the-intrinsic">
<h2><a class="toc-backref" href="#id1">Add the intrinsic</a><a class="headerlink" href="#add-the-intrinsic" title="Permalink to this headline">¶</a></h2>
<p>Multiple files need to be updated when adding a new constrained intrinsic.</p>
<p>Add the new intrinsic to the table of intrinsics:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">include</span><span class="o">/</span><span class="n">llvm</span><span class="o">/</span><span class="n">IR</span><span class="o">/</span><span class="n">Intrinsics</span><span class="o">.</span><span class="n">td</span>
</pre></div>
</div>
</div>
<div class="section" id="add-selectiondag-node-types">
<h2><a class="toc-backref" href="#id2">Add SelectionDAG node types</a><a class="headerlink" href="#add-selectiondag-node-types" title="Permalink to this headline">¶</a></h2>
<p>Add the new STRICT version of the node type to the ISD::NodeType enum:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">include</span><span class="o">/</span><span class="n">llvm</span><span class="o">/</span><span class="n">CodeGen</span><span class="o">/</span><span class="n">ISDOpcodes</span><span class="o">.</span><span class="n">h</span>
</pre></div>
</div>
<p>Strict version name must be a concatenation of prefix <code class="docutils literal notranslate"><span class="pre">STRICT_</span></code> and the name
of corresponding non-strict node name. For instance, strict version of the
node FADD must be STRICT_FADD.</p>
</div>
<div class="section" id="update-mappings">
<h2><a class="toc-backref" href="#id3">Update mappings</a><a class="headerlink" href="#update-mappings" title="Permalink to this headline">¶</a></h2>
<p>Add new record to the mapping of instructions to constrained intrinsic and
DAG nodes:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">include</span><span class="o">/</span><span class="n">llvm</span><span class="o">/</span><span class="n">IR</span><span class="o">/</span><span class="n">ConstrainedOps</span><span class="o">.</span><span class="k">def</span>
</pre></div>
</div>
<p>Follow instructions provided in this file.</p>
</div>
<div class="section" id="update-ir-components">
<h2><a class="toc-backref" href="#id4">Update IR components</a><a class="headerlink" href="#update-ir-components" title="Permalink to this headline">¶</a></h2>
<p>Update the IR verifier:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lib</span><span class="o">/</span><span class="n">IR</span><span class="o">/</span><span class="n">Verifier</span><span class="o">.</span><span class="n">cpp</span>
</pre></div>
</div>
</div>
<div class="section" id="update-selector-components">
<h2><a class="toc-backref" href="#id5">Update Selector components</a><a class="headerlink" href="#update-selector-components" title="Permalink to this headline">¶</a></h2>
<div class="section" id="building-the-selectiondag">
<h3><a class="toc-backref" href="#id6">Building the SelectionDAG</a><a class="headerlink" href="#building-the-selectiondag" title="Permalink to this headline">¶</a></h3>
<p>The function SelectionDAGBuilder::visitConstrainedFPIntrinsic builds DAG nodes
using mappings specified in ConstrainedOps.def. If however this default build is
not sufficient, the build can be modified, see how it is implemented for
STRICT_FP_ROUND. The new STRICT node will eventually be converted
to the matching non-STRICT node. For this reason it should have the same
operands and values as the non-STRICT version but should also use the chain.
This makes subsequent sharing of code for STRICT and non-STRICT code paths
easier:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lib</span><span class="o">/</span><span class="n">CodeGen</span><span class="o">/</span><span class="n">SelectionDAG</span><span class="o">/</span><span class="n">SelectionDAGBuilder</span><span class="o">.</span><span class="n">cpp</span>
</pre></div>
</div>
<p>Most of the STRICT nodes get legalized the same as their matching non-STRICT
counterparts. A new STRICT node with this property must get added to the
switch in SelectionDAGLegalize::LegalizeOp().:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lib</span><span class="o">/</span><span class="n">CodeGen</span><span class="o">/</span><span class="n">SelectionDAG</span><span class="o">/</span><span class="n">LegalizeDAG</span><span class="o">.</span><span class="n">cpp</span>
</pre></div>
</div>
<p>Other parts of the legalizer may need to be updated as well. Look for
places where the non-STRICT counterpart is legalized and update as needed.
Be careful of the chain since STRICT nodes use it but their counterparts
often don’t.</p>
<p>The code to do the conversion or mutation of the STRICT node to a non-STRICT
version of the node happens in SelectionDAG::mutateStrictFPToFP(). In most cases
the function can do the conversion using information from ConstrainedOps.def. Be
careful updating this function since some nodes have the same return type
as their input operand, but some are different. Both of these cases must
be properly handled:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lib</span><span class="o">/</span><span class="n">CodeGen</span><span class="o">/</span><span class="n">SelectionDAG</span><span class="o">/</span><span class="n">SelectionDAG</span><span class="o">.</span><span class="n">cpp</span>
</pre></div>
</div>
<p>Whether the mutation may happens or not, depends on how the new node has been
registered in TargetLoweringBase::initActions(). By default all strict nodes are
registered with Expand action:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lib</span><span class="o">/</span><span class="n">CodeGen</span><span class="o">/</span><span class="n">TargetLoweringBase</span><span class="o">.</span><span class="n">cpp</span>
</pre></div>
</div>
<p>To make debug logs readable it is helpful to update the SelectionDAG’s
debug logger::</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lib</span><span class="o">/</span><span class="n">CodeGen</span><span class="o">/</span><span class="n">SelectionDAG</span><span class="o">/</span><span class="n">SelectionDAGDumper</span><span class="o">.</span><span class="n">cpp</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="add-documentation-and-tests">
<h2><a class="toc-backref" href="#id7">Add documentation and tests</a><a class="headerlink" href="#add-documentation-and-tests" title="Permalink to this headline">¶</a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">docs</span><span class="o">/</span><span class="n">LangRef</span><span class="o">.</span><span class="n">rst</span>
</pre></div>
</div>
</div>
</div>


            <div class="clearer"></div>
          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="AdvancedBuilds.html" title="Advanced Build Configurations"
             >next</a> |</li>
        <li class="right" >
          <a href="UserGuides.html" title="User Guides"
             >previous</a> |</li>
  <li><a href="https://llvm.org/">LLVM Home</a>&nbsp;|&nbsp;</li>
  <li><a href="index.html">Documentation</a>&raquo;</li>

          <li class="nav-item nav-item-1"><a href="UserGuides.html" >User Guides</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">How To Add A Constrained Floating-Point Intrinsic</a></li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; Copyright 2003-2021, LLVM Project.
      Last updated on 2021-09-18.
      Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.5.4.
    </div>
  </body>
</html>