Changeset 7db4836
 Timestamp:
 Feb 28, 2019, 2:54:05 PM (5 years ago)
 Branches:
 ADT, aaronthesis, armeh, astexperimental, cleanupdtors, enum, forallpointerdecay, jacob/cs343translation, jenkinssandbox, master, newast, newastuniqueexpr, pthreademulation, qualifiedEnum
 Children:
 5934c5f, 6e4411f
 Parents:
 58732d1
 Location:
 doc/theses/aaron_moss_PhD/phd
 Files:

 4 added
 3 edited
Legend:
 Unmodified
 Added
 Removed

doc/theses/aaron_moss_PhD/phd/resolutionheuristics.tex
r58732d1 r7db4836 36 36 With more specificity, the cost is a lexicographicallyordered tuple, where each element corresponds to a particular kind of conversion. 37 37 In Bilson's design, conversion cost is a 3tuple, $(unsafe, poly, safe)$, where $unsafe$ is the count of unsafe (narrowing) conversions, $poly$ is the count of polymorphic type bindings, and $safe$ is the sum of the degree of safe (widening) conversions. 38 Degree of safe conversion is calculated as path weight in a directed graph of safe conversions between types; both Bilson's version and the current version of this graph are in Figure~\ref{safeconvgraphfig}.38 Degree of safe conversion is calculated as path weight in a directed graph of safe conversions between types; Bilson's version and the current version of this graph are in Figures~\ref{bilsonconvfig} and~\ref{extendedconvfig}, respectively. 39 39 The safe conversion graph is designed such that the common type $c$ of two types $u$ and $v$ is compatible with the C standard definitions from \cite[\S{}6.3.1.8]{C11} and can be calculated as the unique type minimizing the sum of the path weights of $\overrightarrow{uc}$ and $\overrightarrow{vc}$. 40 40 The following example lists the cost in the Bilson model of calling each of the following functions with two !int! parameters: … … 51 51 Note that safe and unsafe conversions are handled differently; \CFA{} counts distance of safe conversions (\eg{} !int! to !long! is cheaper than !int! to !unsigned long!), while only counting the number of unsafe conversions (\eg{} !int! to !char! and !int! to !short! both have unsafe cost 1, as in the first two declarations above). 52 52 These costs are summed over the parameters in a call; in the example above, the cost of the two !int! to !long! conversions for the fourth declaration sum equal to the one !int! to !unsigned long! conversion in the fifth. 53 54 \begin{figure} 55 \centering 56 \begin{subfigure}[h]{3in} 57 \includegraphics{figures/bilsonconvgraph} 58 \caption{Bilson} \label{bilsonconvfig} 59 \end{subfigure}~\begin{subfigure}[h]{3in} 60 \includegraphics{figures/extendedconvgraph} 61 \caption{Extended} \label{extendedconvfig} 62 \end{subfigure} 63 % \includegraphics{figures/safeconvgraph} 64 \caption[Safe conversion graphs.]{Safe conversion graphs. In both graphs, plain arcs have cost $safe = 1, sign = 0$ while dashed signconversion arcs have cost $safe = 1, sign = 1$. As per \cite[\S{}6.3.1.8]{C11}, types promote to types of the same signedness with greater rank, from \lstinline{signed} to \lstinline{unsigned} with the same rank, and from \lstinline{unsigned} to \lstinline{signed} with greater size. The arc from \lstinline{unsigned long} to \lstinline{long long} (highlighted in red in \ref{bilsonconvfig}) is deliberately omitted in \ref{extendedconvfig}, as on the presented system \lstinline{sizeof(long) == sizeof(long long)}.} 65 \label{safeconvfig} 66 \end{figure} 53 67 54 68 As part of adding reference types to \CFA{} (see Section~\ref{typefeaturessec}), Schluntz added a new $reference$ element to the cost tuple, which counts the number of implicit referencetorvalue conversions performed so that candidate interpretations can be distinguished by how closely they match the nesting of reference types; since references are meant to act almost indistinguishably from lvalues, this $reference$ element is the least significant in the lexicographic comparison of cost tuples. … … 95 109 A final refinement I have made to the \CFA{} cost model is with regard to choosing among arithmetic conversions. 96 110 The C standard \cite[\S{}6.3.1.8]{C11} states that the common type of !int! and !unsigned int! is !unsigned int! and that the common type of !int! and !long! is !long!, but does not provide guidance for making a choice among conversions. 97 Bilson's \CFACC{} uses conversion costs based off the left graph in Figure~\ref{safeconvgraphfig}.111 Bilson's \CFACC{} uses conversion costs based off Figure~\ref{bilsonconvfig}. 98 112 However, Bilson's design results in inconsistent and somewhat surprising costs, with conversion to the nextlarger samesign type generally (but not always) double the cost of conversion to the !unsigned! type of the same size. 99 113 In the redesign, for consistency with the approach of the usual arithmetic conversions, which select a common type primarily based on size, but secondarily on sign, arcs in the new graph are annotated with whether they represent a sign change, and such sign changes are summed in a new $sign$ cost element that lexicographically succeeds $safe$. 100 114 This means that sign conversions are approximately the same cost as widening conversions, but slightly more expensive (as opposed to less expensive in Bilson's graph). 101 102 \begin{figure}103 \centering104 \includegraphics{figures/safeconvgraph}105 \caption[Safe conversion graphs.]{Safe conversion graphs; Bilson's on the left, the extended graph on the right. In both graphs, plain arcs have cost $safe = 1, sign = 0$ while dashed signconversion arcs have cost $safe = 1, sign = 1$. As per \cite[\S{}6.3.1.8]{C11}, types promote to types of the same signedness with greater rank, from \lstinline{signed} to \lstinline{unsigned} with the same rank, and from \lstinline{unsigned} to \lstinline{signed} with greater size. The arc from \lstinline{unsigned long} to \lstinline{long long} is deliberately omitted in the modified graph, as on the presented system \lstinline{sizeof(long) == sizeof(long long)}.}106 \label{safeconvgraphfig}107 \end{figure}108 115 109 116 With these modifications, the current \CFA{} cost tuple is as follows:
Note: See TracChangeset
for help on using the changeset viewer.