Jeremy Siek 6 years ago
parent
commit
96346c5265
1 changed files with 107 additions and 124 deletions
  1. 107 124
      book.tex

+ 107 - 124
book.tex

@@ -2519,7 +2519,7 @@ registers.  If we think of registers as colors, the register
 allocation problem becomes the widely-studied graph coloring
 allocation problem becomes the widely-studied graph coloring
 problem~\citep{Balakrishnan:1996ve,Rosen:2002bh}.
 problem~\citep{Balakrishnan:1996ve,Rosen:2002bh}.
 
 
-The reader may be more familiar with the graph coloring problem then he
+The reader may be more familiar with the graph coloring problem than he
 or she realizes; the popular game of Sudoku is an instance of the
 or she realizes; the popular game of Sudoku is an instance of the
 graph coloring problem. The following describes how to build a graph
 graph coloring problem. The following describes how to build a graph
 out of an initial Sudoku board.
 out of an initial Sudoku board.
@@ -2549,40 +2549,42 @@ edges for all of the vertices would make the graph unreadable.
 \end{figure}
 \end{figure}
 
 
 
 
-Given that Sudoku is graph coloring, one can use Sudoku strategies to
-come up with an algorithm for allocating registers. For example, one
-of the basic techniques for Sudoku is called Pencil Marks. The idea is
-that you use a process of elimination to determine what numbers no
-longer make sense for a square, and write down those numbers in the
-square (writing very small). For example, if the number $1$ is
-assigned to a square, then by process of elimination, you can write
-the pencil mark $1$ in all the squares in the same row, column, and
-region. Many Sudoku computer games provide automatic support for
-Pencil Marks. This heuristic also reduces the degree of branching in
-the search tree.
-
+Given that Sudoku is an instance of graph coloring, one can use Sudoku
+strategies to come up with an algorithm for allocating registers. For
+example, one of the basic techniques for Sudoku is called Pencil
+Marks. The idea is that you use a process of elimination to determine
+what numbers no longer make sense for a square, and write down those
+numbers in the square (writing very small). For example, if the number
+$1$ is assigned to a square, then by process of elimination, you can
+write the pencil mark $1$ in all the squares in the same row, column,
+and region. Many Sudoku computer games provide automatic support for
+Pencil Marks. 
+%
 The Pencil Marks technique corresponds to the notion of color
 The Pencil Marks technique corresponds to the notion of color
 \emph{saturation} due to \cite{Brelaz:1979eu}.  The saturation of a
 \emph{saturation} due to \cite{Brelaz:1979eu}.  The saturation of a
 vertex, in Sudoku terms, is the set of colors that are no longer
 vertex, in Sudoku terms, is the set of colors that are no longer
 available. In graph terminology, we have the following definition:
 available. In graph terminology, we have the following definition:
 \begin{equation*}
 \begin{equation*}
-  \mathrm{saturation}(u) = \{ c \;|\; \exists v. v \in \mathrm{adjacent}(u)
+  \mathrm{saturation}(u) = \{ c \;|\; \exists v. v \in \mathrm{neighbors}(u)
      \text{ and } \mathrm{color}(v) = c \}
      \text{ and } \mathrm{color}(v) = c \}
 \end{equation*}
 \end{equation*}
-where $\mathrm{adjacent}(u)$ is the set of vertices adjacent to $u$.
+where $\mathrm{neighbors}(u)$ is the set of vertices that share an
+edge with $u$.
 
 
 Using the Pencil Marks technique leads to a simple strategy for
 Using the Pencil Marks technique leads to a simple strategy for
 filling in numbers: if there is a square with only one possible number
 filling in numbers: if there is a square with only one possible number
 left, then write down that number! But what if there are no squares
 left, then write down that number! But what if there are no squares
 with only one possibility left? One brute-force approach is to just
 with only one possibility left? One brute-force approach is to just
 make a guess. If that guess ultimately leads to a solution, great.  If
 make a guess. If that guess ultimately leads to a solution, great.  If
-not, backtrack to the guess and make a different guess.  Of course,
-backtracking can be horribly time consuming. One standard way to
-reduce the amount of backtracking is to use the most-constrained-first
-heuristic. That is, when making a guess, always choose a square with
-the fewest possibilities left (the vertex with the highest saturation).
-The idea is that choosing highly constrained squares earlier rather
-than later is better because later there may not be any possibilities.
+not, backtrack to the guess and make a different guess.  One good
+thing about Pencil Marks is that it reduces the degree of branching in
+the search tree. Nevertheless, backtracking can be horribly time
+consuming. One way to reduce the amount of backtracking is to use the
+most-constrained-first heuristic. That is, when making a guess, always
+choose a square with the fewest possibilities left (the vertex with
+the highest saturation).  The idea is that choosing highly constrained
+squares earlier rather than later is better because later there may
+not be any possibilities.
 
 
 In some sense, register allocation is easier than Sudoku because we
 In some sense, register allocation is easier than Sudoku because we
 can always cheat and add more numbers by mapping variables to the
 can always cheat and add more numbers by mapping variables to the
@@ -2633,8 +2635,7 @@ with a dash for their color and an empty set for the saturation.
 \node (x) at (6,0)    {$x:-,\{\}$};
 \node (x) at (6,0)    {$x:-,\{\}$};
 \node (y) at (3,-1.5) {$y:-,\{\}$};
 \node (y) at (3,-1.5) {$y:-,\{\}$};
 \node (z) at (6,-1.5) {$z:-,\{\}$};
 \node (z) at (6,-1.5) {$z:-,\{\}$};
-\node (t1) at (9,0)   {$t.1:-,\{\}$};
-\node (t2) at (9,-1.5) {$t.2:-,\{\}$};
+\node (t1) at (9,-1.5)   {$t.1:-,\{\}$};
 
 
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
@@ -2647,22 +2648,20 @@ with a dash for their color and an empty set for the saturation.
 \draw (z) to (w);
 \draw (z) to (w);
 \draw (z) to (y);
 \draw (z) to (y);
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
 We select a maximally saturated vertex and color it $0$. In this case we
 We select a maximally saturated vertex and color it $0$. In this case we
-have a 7-way tie, so we arbitrarily pick $y$. The then mark color $0$
-as no longer available for $w$, $x$, and $z$ because they interfere
-with $y$.
+have a 7-way tie, so we arbitrarily pick $t.1$. The then mark color $0$
+as no longer available for $z$ because it interferes
+with $t.1$.
 \[
 \[
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \node (v) at (0,0)    {$v:-,\{\}$};
 \node (v) at (0,0)    {$v:-,\{\}$};
-\node (w) at (3,0)    {$w:-,\{0\}$};
-\node (x) at (6,0)    {$x:-,\{0\}$};
-\node (y) at (3,-1.5) {$y:0,\{\}$};
+\node (w) at (3,0)    {$w:-,\{\}$};
+\node (x) at (6,0)    {$x:-,\{\}$};
+\node (y) at (3,-1.5) {$y:-,\{\}$};
 \node (z) at (6,-1.5) {$z:-,\{0\}$};
 \node (z) at (6,-1.5) {$z:-,\{0\}$};
-\node (t1) at (9,0)   {$t.1:-,\{\}$};
-\node (t2) at (9,-1.5) {$t.2:-,\{\}$};
+\node (t1) at (9,-1.5)   {$t.1:0,\{\}$};
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
 {
 {
@@ -2674,23 +2673,19 @@ with $y$.
 \draw (z) to (w);
 \draw (z) to (w);
 \draw (z) to (y);
 \draw (z) to (y);
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
-Now we repeat the process, selecting another maximally saturated vertex.
-This time there is a three-way tie between $w$, $x$, and $z$. We color
-$w$ with $1$.
+Now we repeat the process, selecting another maximally saturated
+vertex, which in this case is $z$. We color $z$ with $1$.
 \[
 \[
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
-\node (v) at (0,0)    {$v:-,\{1\}$};
-\node (w) at (3,0)    {$w:1,\{0\}$};
-\node (x) at (6,0)    {$x:-,\{0,1\}$};
-\node (y) at (3,-1.5) {$y:0,\{1\}$};
-\node (z) at (6,-1.5) {$z:-,\{0,1\}$};
-\node (t1) at (9,0)   {$t.1:-,\{\}$};
-\node (t2) at (9,-1.5) {$t.2:-,\{\}$};
+\node (v) at (0,0)    {$v:-,\{\}$};
+\node (w) at (3,0)    {$w:-,\{1\}$};
+\node (x) at (6,0)    {$x:-,\{\}$};
+\node (y) at (3,-1.5) {$y:-,\{1\}$};
+\node (z) at (6,-1.5) {$z:1,\{0\}$};
+\node (t1) at (9,-1.5)   {$t.1:0,\{\}$};
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
 {
 {
@@ -2703,19 +2698,17 @@ $w$ with $1$.
 \draw (z) to (y);
 \draw (z) to (y);
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
-The most saturated vertices are now $x$ and $z$. We color $x$ with the
-next available color which is $2$.
+The most saturated vertices are now $w$ and $y$. We color $w$ with the
+first available color which is $0$.
 \[
 \[
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
-\node (v) at (0,0)    {$v:-,\{1\}$};
-\node (w) at (3,0)    {$w:1,\{0,2\}$};
-\node (x) at (6,0)    {$x:2,\{0,1\}$};
-\node (y) at (3,-1.5) {$y:0,\{1,2\}$};
-\node (z) at (6,-1.5) {$z:-,\{0,1\}$};
-\node (t1) at (9,0)   {$t.1:-,\{\}$};
-\node (t2) at (9,-1.5) {$t.2:-,\{\}$};
+\node (v) at (0,0)    {$v:-,\{0\}$};
+\node (w) at (3,0)    {$w:0,\{1\}$};
+\node (x) at (6,0)    {$x:-,\{0,\}$};
+\node (y) at (3,-1.5) {$y:-,\{0,1\}$};
+\node (z) at (6,-1.5) {$z:1,\{0\}$};
+\node (t1) at (9,-1.5)   {$t.1:0,\{\}$};
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
 {
 {
@@ -2728,18 +2721,16 @@ next available color which is $2$.
 \draw (z) to (y);
 \draw (z) to (y);
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
-Vertex $z$ is the next most highly saturated, so we color $z$ with $2$.
+Vertex $y$ is the next most highly saturated, so we color $y$ with $2$.
 \[
 \[
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
-\node (v) at (0,0)   {$v:-,\{1\}$};
-\node (w) at (3,0)   {$w:1,\{0,2\}$};
-\node (x) at (6,0)   {$x:2,\{0,1\}$};
-\node (y) at (3,-1.5)  {$y:0,\{1,2\}$};
-\node (z) at (6,-1.5)  {$z:2,\{0,1\}$};
-\node (t1) at (9,0)   {$t.1:-,\{2\}$};
-\node (t2) at (9,-1.5) {$t.2:-,\{\}$};
+\node (v) at (0,0)   {$v:-,\{0\}$};
+\node (w) at (3,0)   {$w:0,\{1,2\}$};
+\node (x) at (6,0)   {$x:-,\{0,2\}$};
+\node (y) at (3,-1.5)  {$y:2,\{0,1\}$};
+\node (z) at (6,-1.5)  {$z:1,\{0,2\}$};
+\node (t1) at (9,-1.5)   {$t.1:0,\{\}$};
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
 {
 {
@@ -2752,19 +2743,16 @@ Vertex $z$ is the next most highly saturated, so we color $z$ with $2$.
 \draw (z) to (y);
 \draw (z) to (y);
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
-We have a 2-way tie between $v$ and $t.1$. We choose to color $v$ with
-$0$.
+Now $x$ has the highest saturation, so we color it $1$.
 \[
 \[
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
-\node (v) at (0,0)   {$v:0,\{1\}$};
-\node (w) at (3,0)   {$w:1,\{0,2\}$};
-\node (x) at (6,0)   {$x:2,\{0,1\}$};
-\node (y) at (3,-1.5)  {$y:0,\{1,2\}$};
-\node (z) at (6,-1.5)  {$z:2,\{0,1\}$};
-\node (t1) at (9,0)   {$t.1:-,\{2\}$};
-\node (t2) at (9,-1.5) {$t.2:-,\{\}$};
+\node (v) at (0,0)   {$v:-,\{0\}$};
+\node (w) at (3,0)   {$w:0,\{1,2\}$};
+\node (x) at (6,0)   {$x:1,\{0,2\}$};
+\node (y) at (3,-1.5)  {$y:2,\{0,1\}$};
+\node (z) at (6,-1.5)  {$z:1,\{0,2\}$};
+\node (t1) at (9,-1.5)   {$t.1:0,\{\}$};
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
 {
 {
@@ -2777,19 +2765,16 @@ $0$.
 \draw (z) to (y);
 \draw (z) to (y);
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
-In the last two steps of the algorithm, we color $t.1$ with $0$
-then $t.2$ with $1$.
+In the last two steps of the algorithm, we color $v$ with $1$.
 \[
 \[
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
-\node (v) at (0,0)   {$v:0,\{1\}$};
-\node (w) at (3,0)   {$w:1,\{0,2\}$};
-\node (x) at (6,0)   {$x:2,\{0,1\}$};
-\node (y) at (3,-1.5)  {$y:0,\{1,2\}$};
-\node (z) at (6,-1.5)  {$z:2,\{0,1\}$};
-\node (t1) at (9,0)   {$t.1:0,\{2,1\}$};
-\node (t2) at (9,-1.5) {$t.2:1,\{0\}$};
+\node (v) at (0,0)   {$v:1,\{0\}$};
+\node (w) at (3,0)   {$w:0,\{1,2\}$};
+\node (x) at (6,0)   {$x:1,\{0,2\}$};
+\node (y) at (3,-1.5)  {$y:2,\{0,1\}$};
+\node (z) at (6,-1.5)  {$z:1,\{0,2\}$};
+\node (t1) at (9,-1.5)   {$t.1:0,\{\}$};
 \draw (t1) to (z);
 \draw (t1) to (z);
-\draw (t2) to (t1);
 \draw (v) to (w);
 \draw (v) to (w);
 \foreach \i in {w,x,y}
 \foreach \i in {w,x,y}
 {
 {
@@ -2803,65 +2788,63 @@ then $t.2$ with $1$.
 \end{tikzpicture}
 \end{tikzpicture}
 \]
 \]
 
 
-
 With the coloring complete, we can finalize the assignment of
 With the coloring complete, we can finalize the assignment of
 variables to registers and stack locations. Recall that if we have $k$
 variables to registers and stack locations. Recall that if we have $k$
 registers, we map the first $k$ colors to registers and the rest to
 registers, we map the first $k$ colors to registers and the rest to
-stack locations.  Suppose for the moment that we just have one extra
-register to use for register allocation, just \key{rbx}. Then the
-following is the mapping of colors to registers and stack allocations.
+stack locations.  Suppose for the moment that we have just one
+register to use for register allocation, \key{rcx}. Then the following
+is the mapping of colors to registers and stack allocations.
 \[
 \[
-  \{ 0 \mapsto \key{\%rbx}, \; 1 \mapsto \key{-8(\%rbp)}, \; 2 \mapsto \key{-16(\%rbp)}, \ldots \}
+  \{ 0 \mapsto \key{\%rcx}, \; 1 \mapsto \key{-8(\%rbp)}, \; 2 \mapsto \key{-16(\%rbp)}, \ldots \}
 \]
 \]
 Putting this mapping together with the above coloring of the variables, we
 Putting this mapping together with the above coloring of the variables, we
 arrive at the assignment:
 arrive at the assignment:
 \begin{gather*}
 \begin{gather*}
-  \{ v \mapsto \key{\%rbx}, \,
-  w \mapsto \key{-8(\%rbp)},  \,
-  x \mapsto \key{-16(\%rbp)}, \,
-  y \mapsto \key{\%rbx},  \,
-  z\mapsto \key{-16(\%rbp)}, \\
-  t.1\mapsto \key{\%rbx} ,\,
-  t.2\mapsto \key{-8(\%rbp)} \}
+  \{ v \mapsto \key{-8(\%rbp)}, \,
+  w \mapsto \key{\%rcx},  \,
+  x \mapsto \key{-8(\%rbp)}, \,
+  y \mapsto \key{-16(\%rbp)},  \,
+  z\mapsto \key{-8(\%rbp)}, 
+  t.1\mapsto \key{\%rcx} \}
 \end{gather*}
 \end{gather*}
 Applying this assignment to our running example
 Applying this assignment to our running example
 (Figure~\ref{fig:reg-eg}) yields the program on the right.\\
 (Figure~\ref{fig:reg-eg}) yields the program on the right.\\
 % why frame size of 32? -JGS
 % why frame size of 32? -JGS
 \begin{minipage}{0.4\textwidth}
 \begin{minipage}{0.4\textwidth}
 \begin{lstlisting}
 \begin{lstlisting}
-  (program (v w x y z)
-    (movq (int 1) (var v))
-    (movq (int 46) (var w))
-    (movq (var v) (var x))
-    (addq (int 7) (var x))
-    (movq (var x) (var y))
-    (addq (int 4) (var y))
-    (movq (var x) (var z))
-    (addq (var w) (var z))
-    (movq (var y) (var t.1))
-    (negq (var t.1))
-    (movq (var z) (var t.2))
-    (addq (var t.1) (var t.2))
-    (movq (var t.2) (reg rax)))
+(block ()
+  (movq (int 1) (var v))
+  (movq (int 46) (var w))
+  (movq (var v) (var x))
+  (addq (int 7) (var x))
+  (movq (var x) (var y))
+  (addq (int 4) (var y))
+  (movq (var x) (var z))
+  (addq (var w) (var z))
+  (movq (var y) (var t.1))
+  (negq (var t.1))
+  (movq (var z) (reg rax))
+  (addq (var t.1) (reg rax))
+  (jmp conclusion))
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 $\Rightarrow$
 $\Rightarrow$
 \begin{minipage}{0.45\textwidth}
 \begin{minipage}{0.45\textwidth}
 \begin{lstlisting}
 \begin{lstlisting}
-(program 16
-  (movq (int 1) (reg rbx))
-  (movq (int 46) (deref rbp -8))
-  (movq (reg rbx) (deref rbp -16))
-  (addq (int 7) (deref rbp -16))
-  (movq (deref rbp -16) (reg rbx))
-  (addq (int 4) (reg rbx))
-  (movq (deref rbp -16) (deref rbp -16))
-  (addq (deref rbp -8) (deref rbp -16))
-  (movq (reg rbx) (reg rbx))
-  (negq (reg rbx))
-  (movq (deref rbp -16) (deref rbp -8))
-  (addq (reg rbx) (deref rbp -8))
-  (movq (deref rbp -8) (reg rax)))
+(block ()
+  (movq (int 1) (reg rdx))
+  (movq (int 46) (reg rcx))
+  (movq (reg rdx) (reg rdx))
+  (addq (int 7) (reg rdx))
+  (movq (reg rdx) (deref rbp -8))
+  (addq (int 4) (deref rbp -8))
+  (movq (reg rdx) (reg rdx))
+  (addq (reg rcx) (reg rdx))
+  (movq (deref rbp -8) (reg rcx))
+  (negq (reg rcx))
+  (movq (reg rdx) (reg rax))
+  (addq (reg rcx) (reg rax))
+  (jmp conclusion))
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}