Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / SimplifyTypes
CommitLineData
7f918cf1
CE
1<!DOCTYPE html>\r
2<html lang="en">\r
3<head>\r
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\r
5<meta name="generator" content="AsciiDoc 8.6.9">\r
6<title>SimplifyTypes</title>\r
7<link rel="stylesheet" href="./asciidoc.css" type="text/css">\r
8<link rel="stylesheet" href="./pygments.css" type="text/css">\r
9\r
10\r
11<script type="text/javascript" src="./asciidoc.js"></script>\r
12<script type="text/javascript">\r
13/*<![CDATA[*/\r
14asciidoc.install();\r
15/*]]>*/\r
16</script>\r
17<link rel="stylesheet" href="./mlton.css" type="text/css">\r
18</head>\r
19<body class="article">\r
20<div id="banner">\r
21<div id="banner-home">\r
22<a href="./Home">MLton 20180207</a>\r
23</div>\r
24</div>\r
25<div id="header">\r
26<h1>SimplifyTypes</h1>\r
27</div>\r
28<div id="content">\r
29<div id="preamble">\r
30<div class="sectionbody">\r
31<div class="paragraph"><p><a href="SimplifyTypes">SimplifyTypes</a> is an optimization pass for the <a href="SSA">SSA</a>\r
32<a href="IntermediateLanguage">IntermediateLanguage</a>, invoked from <a href="SSASimplify">SSASimplify</a>.</p></div>\r
33</div>\r
34</div>\r
35<div class="sect1">\r
36<h2 id="_description">Description</h2>\r
37<div class="sectionbody">\r
38<div class="paragraph"><p>This pass computes a "cardinality" of each datatype, which is an\r
39abstraction of the number of values of the datatype.</p></div>\r
40<div class="ulist"><ul>\r
41<li>\r
42<p>\r
43<span class="monospaced">Zero</span> means the datatype has no values (except for bottom).\r
44</p>\r
45</li>\r
46<li>\r
47<p>\r
48<span class="monospaced">One</span> means the datatype has one value (except for bottom).\r
49</p>\r
50</li>\r
51<li>\r
52<p>\r
53<span class="monospaced">Many</span> means the datatype has many values.\r
54</p>\r
55</li>\r
56</ul></div>\r
57<div class="paragraph"><p>This pass removes all datatypes whose cardinality is <span class="monospaced">Zero</span> or <span class="monospaced">One</span>\r
58and removes:</p></div>\r
59<div class="ulist"><ul>\r
60<li>\r
61<p>\r
62components of tuples\r
63</p>\r
64</li>\r
65<li>\r
66<p>\r
67function args\r
68</p>\r
69</li>\r
70<li>\r
71<p>\r
72constructor args\r
73</p>\r
74</li>\r
75</ul></div>\r
76<div class="paragraph"><p>which are such datatypes.</p></div>\r
77<div class="paragraph"><p>This pass marks constructors as one of:</p></div>\r
78<div class="ulist"><ul>\r
79<li>\r
80<p>\r
81<span class="monospaced">Useless</span>: it never appears in a <span class="monospaced">ConApp</span>.\r
82</p>\r
83</li>\r
84<li>\r
85<p>\r
86<span class="monospaced">Transparent</span>: it is the only variant in its datatype and its argument type does not contain any uses of <span class="monospaced">array</span> or <span class="monospaced">vector</span>.\r
87</p>\r
88</li>\r
89<li>\r
90<p>\r
91<span class="monospaced">Useful</span>: otherwise\r
92</p>\r
93</li>\r
94</ul></div>\r
95<div class="paragraph"><p>This pass also removes <span class="monospaced">Useless</span> and <span class="monospaced">Transparent</span> constructors.</p></div>\r
96</div>\r
97</div>\r
98<div class="sect1">\r
99<h2 id="_implementation">Implementation</h2>\r
100<div class="sectionbody">\r
101<div class="ulist"><ul>\r
102<li>\r
103<p>\r
104<a href="https://github.com/MLton/mlton/blob/master/mlton/ssa/simplify-types.fun"><span class="monospaced">simplify-types.fun</span></a>\r
105</p>\r
106</li>\r
107</ul></div>\r
108</div>\r
109</div>\r
110<div class="sect1">\r
111<h2 id="_details_and_notes">Details and Notes</h2>\r
112<div class="sectionbody">\r
113<div class="paragraph"><p>This pass must happen before polymorphic equality is implemented because</p></div>\r
114<div class="ulist"><ul>\r
115<li>\r
116<p>\r
117it will make polymorphic equality faster because some types are simpler\r
118</p>\r
119</li>\r
120<li>\r
121<p>\r
122it removes uses of polymorphic equality that must return true\r
123</p>\r
124</li>\r
125</ul></div>\r
126<div class="paragraph"><p>We must keep track of <span class="monospaced">Transparent</span> constructors whose argument type\r
127uses <span class="monospaced">array</span> because of datatypes like the following:</p></div>\r
128<div class="listingblock">\r
129<div class="content"><div class="highlight"><pre><span class="k">datatype</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">array</span><span class="w"></span>\r
130</pre></div></div></div>\r
131<div class="paragraph"><p>Such a datatype has <span class="monospaced">Cardinality.Many</span>, but we cannot eliminate the\r
132datatype and replace the lhs by the rhs, i.e. we must keep the\r
133circularity around.</p></div>\r
134<div class="paragraph"><p>Must do similar things for <span class="monospaced">vectors</span>.</p></div>\r
135<div class="paragraph"><p>Also, to eliminate as many <span class="monospaced">Transparent</span> constructors as possible, for\r
136something like the following,</p></div>\r
137<div class="listingblock">\r
138<div class="content"><div class="highlight"><pre><span class="k">datatype</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">array</span><span class="w"></span>\r
139<span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">vector</span><span class="w"></span>\r
140</pre></div></div></div>\r
141<div class="paragraph"><p>we (arbitrarily) expand one of the datatypes first. The result will\r
142be something like</p></div>\r
143<div class="listingblock">\r
144<div class="content"><div class="highlight"><pre><span class="k">datatype</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="n">array</span><span class="w"></span>\r
145</pre></div></div></div>\r
146<div class="paragraph"><p>where all uses of <span class="monospaced">t</span> are replaced by <span class="monospaced">u array</span>.</p></div>\r
147</div>\r
148</div>\r
149</div>\r
150<div id="footnotes"><hr></div>\r
151<div id="footer">\r
152<div id="footer-text">\r
153</div>\r
154<div id="footer-badges">\r
155</div>\r
156</div>\r
157</body>\r
158</html>\r