[pypy-commit] extradoc extradoc: merge

cfbolz noreply at buildbot.pypy.org
Mon Aug 6 10:58:07 CEST 2012


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: extradoc
Changeset: r4428:aa1e4cdd34cb
Date: 2012-08-06 10:57 +0200
http://bitbucket.org/pypy/extradoc/changeset/aa1e4cdd34cb/

Log:	merge

diff --git a/blog/draft/numpy-non-progress.rst b/blog/draft/numpy-non-progress.rst
new file mode 100644
--- /dev/null
+++ b/blog/draft/numpy-non-progress.rst
@@ -0,0 +1,21 @@
+Numpypy non-progress report
+===========================
+
+Hello everyone.
+
+Not much has happened in the past few months with numpypy development. A part
+of the reason was `doing other stuff`_ for me, a part of the reason was
+various unexpected visa-related admin, a part of the reason was EuroPython
+and a part was long-awaited holiday.
+
+The thing that's maybe worth mentioning is that it does not mean the donations
+disappeared in the mist. PyPy developers are being paid to work on NumPyPy on
+an hourly basis - that means if I decide to take holidays or work on something
+else, the money is simply staying in the account until later.
+
+Thanks again for all the donations, I hope to get back to this topic soon!
+
+Cheers,
+fijal
+
+.. _`doing other stuff`: http://morepypy.blogspot.com/2012/07/hello-everyone.html
diff --git a/blog/draft/stm-jul2012.rst b/blog/draft/stm-jul2012.rst
--- a/blog/draft/stm-jul2012.rst
+++ b/blog/draft/stm-jul2012.rst
@@ -141,19 +141,24 @@
 to other CPUs.  This is "easily" achieved by keeping them inside this
 CPU's local cache; rolling back is then just a matter of discarding a
 part of this cache without committing it to memory.  From this point of
-view, there is a lot to bet that we are actually talking about the
-regular per-core Level 1 cache --- so any transaction that cannot fully
-store its read and written data in the 32-64KB of the L1 cache will
-abort.
+view, `there is a lot to bet`__ that we are actually talking about the
+regular per-core Level 1 and Level 2 caches --- so any transaction that
+cannot fully store its read and written data in the 64+256KB of the L1+L2
+caches will abort.
+
+.. __: http://arstechnica.com/business/2012/02/transactional-memory-going-mainstream-with-intel-haswell/
 
 So what does it mean?  A Python interpreter overflows the L1 cache of
 the CPU very quickly: just creating new Python function frames takes a
 lot of memory (on the order of magnitude of 1/100 of the whole L1
-cache).  This means that as long as the HTM support is limited to L1
-caches, it is not going to be enough to run an "AME Python" with any
-sort of medium-to-long transaction (running for 0.01 second or longer).
-It can run a "GIL-less Python", though: just running a few dozen
-bytecodes at a time should fit in the L1 cache, for most bytecodes.
+cache).  Adding a 256KB L2 cache into the picture helps, particularly
+because it is highly associative and thus avoids fake conflicts much
+better.  However, as long as the HTM support is limited to L1+L2 caches,
+it is not going to be enough to run an "AME Python" with any sort of
+medium-to-long transaction (running for 0.01 second or longer).  It can
+run a "GIL-less Python", though: just running a few hunderd or even
+thousand bytecodes at a time should fit in the L1+L2 caches, for most
+bytecodes.
 
 
 Write your own STM for C
@@ -189,6 +194,6 @@
 not the main Python interpreter (which looks unlikely to change anytime
 soon).  Thus as long as only PyPy has STM, it looks like it will not
 become the main model of multicore usage in Python.  However, I can
-conclude with a more positive note than during EuroPython: there appears
-to be a more-or-less reasonable way forward to have an STM version of
-CPython too.
+conclude with a more positive note than during the EuroPython
+conference: there appears to be a more-or-less reasonable way forward to
+have an STM version of CPython too.
diff --git a/talk/ep2012/lightning.html b/talk/ep2012/lightning.html
--- a/talk/ep2012/lightning.html
+++ b/talk/ep2012/lightning.html
@@ -2,7 +2,7 @@
 <head>
 	<meta name="viewport" content="width=1024, user-scalable=no">
   <link rel="stylesheet" href="/home/fijal/src/deckjs/core/deck.core.css">
-  <link rel="stylesheet" href="/home/fijal/src/deckjs/themes/style/web-2.0.css">
+  <link rel="stylesheet" href="tools/web-2.0.css">
   <link rel="stylesheet" href="/home/fijal/src/deckjs/themes/transition/horizontal-slide.css">
   <script src="/home/fijal/src/deckjs/modernizr.custom.js"></script>
   <script src="/home/fijal/src/deckjs/jquery-1.7.min.js"></script>
@@ -34,7 +34,10 @@
     <ul>
       <li>Cape Town</li>
       <li>First ever in Africa</li>
+      <li>October 4th and 5th</li>
     </ul>
+  </section>
+  <section class="slide">
     <img width="800px" src="http://1.bp.blogspot.com/-k5q6rD3Cy_0/Tr51fcamu5I/AAAAAAAAAkk/bhrC-NcBu7U/s1600/%2528South+Africa%2529+-+Table+Mountain+-+The+Landmark+of+Cape+Town+2.jpg"/>
   </section>
   <section class="slide">
diff --git a/talk/vmil2012/Makefile b/talk/vmil2012/Makefile
--- a/talk/vmil2012/Makefile
+++ b/talk/vmil2012/Makefile
@@ -1,5 +1,5 @@
 
-jit-guards.pdf: paper.tex paper.bib figures/log.tex figures/example.tex figures/benchmarks_table.tex figures/backend_table.tex figures/ops_count_table.tex
+jit-guards.pdf: paper.tex paper.bib figures/log.tex figures/example.tex figures/benchmarks_table.tex figures/backend_table.tex figures/ops_count_table.tex figures/loop_bridge.pdf figures/guard_table.tex
 	pdflatex paper
 	bibtex paper
 	pdflatex paper
@@ -37,3 +37,7 @@
 logs::
 	tool/run_benchmarks.sh
 
+clean:
+	rm -f *.aux *.bbl *.blg *.log *.tdo
+	rm -f *.pdf
+	rm -f figures/*table.tex figures/*table.aux
diff --git a/talk/vmil2012/figures/loop_bridge.graffle b/talk/vmil2012/figures/loop_bridge.graffle
new file mode 100644
--- /dev/null
+++ b/talk/vmil2012/figures/loop_bridge.graffle
@@ -0,0 +1,1407 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActiveLayerIndex</key>
+	<integer>0</integer>
+	<key>ApplicationVersion</key>
+	<array>
+		<string>com.omnigroup.OmniGrafflePro</string>
+		<string>139.7.0.167456</string>
+	</array>
+	<key>AutoAdjust</key>
+	<true/>
+	<key>BackgroundGraphic</key>
+	<dict>
+		<key>Bounds</key>
+		<string>{{0, 0}, {559, 783}}</string>
+		<key>Class</key>
+		<string>SolidGraphic</string>
+		<key>ID</key>
+		<integer>2</integer>
+		<key>Style</key>
+		<dict>
+			<key>shadow</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+			<key>stroke</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+		</dict>
+	</dict>
+	<key>BaseZoom</key>
+	<integer>0</integer>
+	<key>CanvasOrigin</key>
+	<string>{0, 0}</string>
+	<key>ColumnAlign</key>
+	<integer>1</integer>
+	<key>ColumnSpacing</key>
+	<real>36</real>
+	<key>CreationDate</key>
+	<string>2012-07-24 10:50:56 +0000</string>
+	<key>Creator</key>
+	<string>David Schneider</string>
+	<key>DisplayScale</key>
+	<string>1.000 cm = 1.000 cm</string>
+	<key>GraphDocumentVersion</key>
+	<integer>8</integer>
+	<key>GraphicsList</key>
+	<array>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>42</integer>
+			</dict>
+			<key>ID</key>
+			<integer>61</integer>
+			<key>Points</key>
+			<array>
+				<string>{83, 205}</string>
+				<string>{42, 264.875}</string>
+				<string>{83, 334.75}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>Pattern</key>
+					<integer>2</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>24</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>Group</string>
+			<key>Graphics</key>
+			<array>
+				<dict>
+					<key>Bounds</key>
+					<string>{{151.00001525878906, 447.5}, {166.99998474121094, 93.5}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>59</integer>
+					<key>Magnets</key>
+					<array>
+						<string>{1, 0}</string>
+						<string>{-1, 0}</string>
+					</array>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Text</key>
+					<dict>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Monaco;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs20 \cf0 read ll resume data\
+decode resume data\
+retrieve stack and register values\
+...}</string>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{151, 414}, {167, 33.5}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>60</integer>
+					<key>Magnets</key>
+					<array>
+						<string>{0, 1}</string>
+						<string>{0, -1}</string>
+					</array>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Text</key>
+					<dict>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 compensation code}</string>
+					</dict>
+				</dict>
+			</array>
+			<key>ID</key>
+			<integer>58</integer>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>40</integer>
+			</dict>
+			<key>ID</key>
+			<integer>56</integer>
+			<key>Points</key>
+			<array>
+				<string>{323.5, 350.5}</string>
+				<string>{338, 414}</string>
+				<string>{346.8410005147403, 506.4534215178565}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>Pattern</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>44</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>41</integer>
+			</dict>
+			<key>ID</key>
+			<integer>55</integer>
+			<key>Points</key>
+			<array>
+				<string>{375, 301.25}</string>
+				<string>{418, 369}</string>
+				<string>{421.99397498596954, 444.99998514226786}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>Pattern</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>43</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>39</integer>
+			</dict>
+			<key>ID</key>
+			<integer>54</integer>
+			<key>Points</key>
+			<array>
+				<string>{92.51008491617111, 351.93749427457396}</string>
+				<string>{131, 421.49998514226786}</string>
+				<string>{121.99397498596946, 517.5}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>Pattern</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>42</integer>
+				<key>Info</key>
+				<integer>2</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>38</integer>
+			</dict>
+			<key>ID</key>
+			<integer>53</integer>
+			<key>Points</key>
+			<array>
+				<string>{83, 301.25}</string>
+				<string>{42, 373}</string>
+				<string>{46.9741099939598, 433.72820859342926}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>Pattern</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>37</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>44</integer>
+			</dict>
+			<key>ID</key>
+			<integer>52</integer>
+			<key>Points</key>
+			<array>
+				<string>{376, 205}</string>
+				<string>{414, 274}</string>
+				<string>{375, 333.75}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>34</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>43</integer>
+			</dict>
+			<key>ID</key>
+			<integer>51</integer>
+			<key>Points</key>
+			<array>
+				<string>{376, 159}</string>
+				<string>{413, 215.5}</string>
+				<string>{375, 301.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>32</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>60</integer>
+			</dict>
+			<key>ID</key>
+			<integer>50</integer>
+			<key>Points</key>
+			<array>
+				<string>{272, 301.25}</string>
+				<string>{248, 330}</string>
+				<string>{234.5, 414}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>43</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>60</integer>
+			</dict>
+			<key>ID</key>
+			<integer>49</integer>
+			<key>Points</key>
+			<array>
+				<string>{323.5, 350.5}</string>
+				<string>{257, 386}</string>
+				<string>{234.5, 414}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>44</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>60</integer>
+			</dict>
+			<key>ID</key>
+			<integer>48</integer>
+			<key>Points</key>
+			<array>
+				<string>{186, 334.75}</string>
+				<string>{211, 366}</string>
+				<string>{234.5, 414}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>Pattern</key>
+					<integer>2</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>42</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>60</integer>
+			</dict>
+			<key>ID</key>
+			<integer>47</integer>
+			<key>Points</key>
+			<array>
+				<string>{186, 301.25}</string>
+				<string>{211, 328}</string>
+				<string>{234.5, 414}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>37</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>30</integer>
+			</dict>
+			<key>ID</key>
+			<integer>46</integer>
+			<key>Points</key>
+			<array>
+				<string>{188, 205}</string>
+				<string>{231, 158}</string>
+				<string>{271, 113}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>24</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>37</integer>
+			</dict>
+			<key>ID</key>
+			<integer>45</integer>
+			<key>Points</key>
+			<array>
+				<string>{83, 159}</string>
+				<string>{42, 222}</string>
+				<string>{83, 301.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>18</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{272, 317}, {103, 33.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>44</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Trampoline #4}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{272, 284.5}, {103, 33.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>43</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Trampoline #3}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 318}, {103, 33.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>42</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Pattern</key>
+					<integer>2</integer>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Trampoline #2}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{342, 421.49998514226786}, {85, 47}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>41</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Cloud</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 ll resume data #3}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{341.99998930037054, 493.99999618530273}, {85, 47}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>40</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Cloud</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 ll resume data #4}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{42, 494}, {85, 47}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>39</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Cloud</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 ll resume data #2}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{42, 421.5}, {85, 47}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>38</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Cloud</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 ll resume data #1}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 284.5}, {103, 33.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>37</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Trampoline #1}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 238.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>36</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 jump}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 215.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>35</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 193.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>34</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.4</string>
+						<key>g</key>
+						<string>0.8</string>
+						<key>r</key>
+						<string>1</string>
+					</dict>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 guard 4}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 170.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>33</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 147.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>32</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.4</string>
+						<key>g</key>
+						<string>0.8</string>
+						<key>r</key>
+						<string>1</string>
+					</dict>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 guard 3}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 124.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>31</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{271, 101.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>30</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{248, 59}, {151, 24}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>29</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Bridge from guard #2}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{248, 83}, {151, 286}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>28</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 238.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>27</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 jump}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 215.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>26</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 193.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>24</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.4</string>
+						<key>g</key>
+						<string>0.8</string>
+						<key>r</key>
+						<string>1</string>
+					</dict>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 patched guard #2}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 170.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>19</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 147.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>18</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.4</string>
+						<key>g</key>
+						<string>0.8</string>
+						<key>r</key>
+						<string>1</string>
+					</dict>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 guard #1}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 124.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>17</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{83, 101.5}, {105, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>16</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 operation}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{60, 59}, {151, 24}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>20</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Trace}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{60, 83}, {151, 286}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>23</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+		</dict>
+	</array>
+	<key>GridInfo</key>
+	<dict/>
+	<key>GuidesLocked</key>
+	<string>NO</string>
+	<key>GuidesVisible</key>
+	<string>YES</string>
+	<key>HPages</key>
+	<integer>1</integer>
+	<key>ImageCounter</key>
+	<integer>1</integer>
+	<key>KeepToScale</key>
+	<false/>
+	<key>Layers</key>
+	<array>
+		<dict>
+			<key>Lock</key>
+			<string>NO</string>
+			<key>Name</key>
+			<string>Layer 1</string>
+			<key>Print</key>
+			<string>YES</string>
+			<key>View</key>
+			<string>YES</string>
+		</dict>
+	</array>
+	<key>LayoutInfo</key>
+	<dict>
+		<key>Animate</key>
+		<string>NO</string>
+		<key>circoMinDist</key>
+		<real>18</real>
+		<key>circoSeparation</key>
+		<real>0.0</real>
+		<key>layoutEngine</key>
+		<string>dot</string>
+		<key>neatoSeparation</key>
+		<real>0.0</real>
+		<key>twopiSeparation</key>
+		<real>0.0</real>
+	</dict>
+	<key>LinksVisible</key>
+	<string>NO</string>
+	<key>MagnetsVisible</key>
+	<string>NO</string>
+	<key>MasterSheets</key>
+	<array/>
+	<key>ModificationDate</key>
+	<string>2012-08-02 13:05:21 +0000</string>
+	<key>Modifier</key>
+	<string>David Schneider</string>
+	<key>NotesVisible</key>
+	<string>NO</string>
+	<key>Orientation</key>
+	<integer>2</integer>
+	<key>OriginVisible</key>
+	<string>NO</string>
+	<key>PageBreaks</key>
+	<string>YES</string>
+	<key>PrintInfo</key>
+	<dict>
+		<key>NSBottomMargin</key>
+		<array>
+			<string>float</string>
+			<string>41</string>
+		</array>
+		<key>NSHorizonalPagination</key>
+		<array>
+			<string>coded</string>
+			<string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG</string>
+		</array>
+		<key>NSLeftMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSPaperSize</key>
+		<array>
+			<string>size</string>
+			<string>{595, 842}</string>
+		</array>
+		<key>NSPrintReverseOrientation</key>
+		<array>
+			<string>int</string>
+			<string>0</string>
+		</array>
+		<key>NSRightMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSTopMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+	</dict>
+	<key>PrintOnePage</key>
+	<false/>
+	<key>ReadOnly</key>
+	<string>NO</string>
+	<key>RowAlign</key>
+	<integer>1</integer>
+	<key>RowSpacing</key>
+	<real>36</real>
+	<key>SheetTitle</key>
+	<string>Canvas 1</string>
+	<key>SmartAlignmentGuidesActive</key>
+	<string>YES</string>
+	<key>SmartDistanceGuidesActive</key>
+	<string>YES</string>
+	<key>UniqueID</key>
+	<integer>1</integer>
+	<key>UseEntirePage</key>
+	<false/>
+	<key>VPages</key>
+	<integer>1</integer>
+	<key>WindowInfo</key>
+	<dict>
+		<key>CurrentSheet</key>
+		<integer>0</integer>
+		<key>ExpandedCanvases</key>
+		<array>
+			<dict>
+				<key>name</key>
+				<string>Canvas 1</string>
+			</dict>
+		</array>
+		<key>ListView</key>
+		<true/>
+		<key>OutlineWidth</key>
+		<integer>142</integer>
+		<key>RightSidebar</key>
+		<false/>
+		<key>ShowRuler</key>
+		<true/>
+		<key>Sidebar</key>
+		<true/>
+		<key>SidebarWidth</key>
+		<integer>120</integer>
+		<key>Zoom</key>
+		<real>1</real>
+		<key>ZoomValues</key>
+		<array>
+			<array>
+				<string>Canvas 1</string>
+				<real>1</real>
+				<real>1</real>
+			</array>
+		</array>
+	</dict>
+</dict>
+</plist>
diff --git a/talk/vmil2012/figures/loop_bridge.pdf b/talk/vmil2012/figures/loop_bridge.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a73e62a7afeb03fb031f00c14de9543754ade016
GIT binary patch

[cut]

diff --git a/talk/vmil2012/paper.bib b/talk/vmil2012/paper.bib
--- a/talk/vmil2012/paper.bib
+++ b/talk/vmil2012/paper.bib
@@ -1,3 +1,14 @@
+ at inproceedings{Gal:2006,
+        author = {Gal, Andread and Probst, Christian W. and Franz, Michael},
+        title = {{HotpathVM: An Effective JIT Compiler for Resource-constrained Devices}},
+        location = {Ottawa, {Ontario}, {Canada}},
+        series = {{VEE} '06},
+        isbn = {1-59593-332-6}, 
+        booktitle = {Proceedings of the 2nd International Conference on Virtual Execution Environments}, 
+        publisher = {{ACM}},
+        year = {2006},
+        pages = {144-153}
+}
 @inproceedings{Gal:2009ux,
         author = {Gal, Andreas and Franz, Michael and Eich, B and Shaver, M and Anderson, David},
         title = {{Trace-based Just-in-Time Type Specialization for Dynamic Languages}},
@@ -9,5 +20,11 @@
         title = {{Dynamo: A Transparent Dynamic Optimization System}},
         booktitle = {PLDI '00: Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation},
 }
+ at misc{Pall:2009,
+    author = {Pall, Mike},
+    title = {LuaJIT 2.0 intellectual property disclosure and research opportunities},
+    month = jun,
+    year = {2009},
+    url = {http://lua-users.org/lists/lua-l/2009-11/msg00089.html}
+}
 
-
diff --git a/talk/vmil2012/paper.tex b/talk/vmil2012/paper.tex
--- a/talk/vmil2012/paper.tex
+++ b/talk/vmil2012/paper.tex
@@ -1,4 +1,4 @@
-\documentclass[10pt]{sigplanconf}
+\documentclass[10pt,preprint]{sigplanconf}
 
 \usepackage{ifthen}
 \usepackage{fancyvrb}
@@ -79,7 +79,7 @@
 \authorinfo{David Schneider$^{a}$ \and Carl Friedrich Bolz$^a$}
            {$^a$Heinrich-Heine-Universit&#228;t D&#252;sseldorf, STUPS Group, Germany
            }
-           {XXX emails}
+           {david.schneider at uni-duesseldorf.de \and cfbolz at gmx.de}
 
 \conferenceinfo{VMIL'12}{}
 \CopyrightYear{2012}
@@ -96,55 +96,92 @@
 \keywords{XXX}
 
 \begin{abstract}
-
+In pellentesque faucibus vestibulum. Nulla at nulla justo, eget luctus tortor.
+Nulla facilisi. Duis aliquet egestas purus in blandit. Curabitur vulputate,
+ligula lacinia scelerisque tempor, lacus lacus ornare ante, ac egestas est urna
+sit amet arcu. Class aptent taciti sociosqu ad litora torquent per conubia
+nostra, per inceptos himenaeos. Sed molestie augue sit amet leo consequat
+posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices
+posuere cubilia Curae; Proin vel ante a orci tempus eleifend ut et magna. Lorem
+ipsum dolor sit amet, consectetur adipiscing elit. Vivamus luctus urna sed urna
+ultricies ac tempor dui sagittis. In.
 \end{abstract}
 
 
 %___________________________________________________________________________
 \section{Introduction}
 
-
-\todo{add page numbers (draft) for review}
 In this paper we describe and analyze how deoptimization works in the context
 of tracing just-in-time compilers. What instructions are used in the
 intermediate and low-level representation of the JIT instructions and how these
 are implemented.
 
-\begin{figure*}
-    \include{figures/ops_count_table}
-    \caption{Relative numbers of operations in the traces generated for
-    different benchmarks}
-    \label{fig:ops_count}
-\end{figure*}
-Although there are several publications about tracing just-in-time compilers, to
-our knowledge, there are none that describe the use and implementation of
-guards in this context. With the following contributions we aim to shed some
-light (to much?) on this topic.
-The contributions of this paper are:
-\todo{more motivation}
+Although there are several publications about tracing just-in-time compilers,
+to our knowledge, there are none that describe deoptimization and the use and
+implementation of guards in this context.
+
 Based on the informal observation that guards are among the most common
 operations in the traces produced by PyPy's tracing JIT and that guards are
 operations that are associated with an overhead to maintain information about
-state to be able to rebuild it, our goal is to present concrete numbers for the
-frequency and the overhead produced by guards, explain how they are implemented
-in the different levels of PyPy's tracing JIT and explain the rationale behind
-the design decisions based on the numbers.
-As can be seen on Figure~\ref{fig:ops_count} guards account for 14.42\% to
-22.32\% of the operations before and for 15.2\% to 20.12\% of after the
-optimization pass over the traced and compiled paths of the benchmarks.
-Figure~\ref{fig:benchmarks} shows the absolute number of operations for each
-benchmark, for every guard that stays alive after optimization there are
-several kinds of metadata created and stored at different levels of the JIT to
-be able to rebuild the interpreter or tracer state from a guard failure making
-the optimization \bivab{some good word} of guards an important aspect of the
-low-level design of a tracing just-in-time compiler.
-\todo{extend}
-\todo{contributions, description of PyPy's guard architecture, analysis on benchmarks}
+state to be able to rebuild the execution state in case of deoptimization, our
+goal is to present concrete numbers for the frequency and the overhead produced
+by guards, explain how they are implemented in the different levels of PyPy's
+tracing JIT and explain the rationale behind the design decisions based on the
+numbers.
+
+The operations executed by an interpreter are recorded by the tracing JIT in
+case they are frequently executed, this process is described in more detail in
+Section~\ref{sec:Resume Data}, during the recording phase special operations,
+\texttt{guards}, are inserted into the recorded trace at all points where
+control flow could diverge. As can be seen on Figure~\ref{fig:guard_percent}
+guards account for 14.42\% to 22.32\% of the operations before and for 15.2\%
+to 20.12\% of the operations after the optimization pass over the traced and
+compiled parts of the benchmarks, making guards one of the most common
+operations. Many of these guards fail rarely on not all during execution. Given
+that associated with each guard information is stored, that is required to
+rebuild the execution state in case control flow diverges from the recorded
+path at a guard it is important to store the information associated with the
+guards in a manner that tries to keep the overhead for storing the information
+low while avoiding to put a burden on the execution of the recorded trace,
+making the optimization of guards an important aspect of
+the low-level design of a tracing just-in-time compiler.
+
+%Section~\ref{sec:Evaluation} presents Figures about the absolute number of
+%operations for each benchmark, and the overhead produced by the information
+%stored at the different levels for the guards
+In this paper we want to substantiate the aforementioned observations and
+describe based on them the reasoning behind and the implementation of guards in
+PyPy's tracing just-in-time compiler, the contributions of this paper are:
 \begin{itemize}
- \item
+  \item An analysis of guards in the context of PyPy's tracing JIT to
+  substantiate the aforementioned observation, based on a set of benchmarks.
+  \item We provide a detailed measurements about the frequency and the
+  overhead associated with guards.
+  \item We provide a description about how guards are implemented in the high\-
+  and low-level parts of the JIT and describe the rationale behind the design.
 \end{itemize}
+\begin{figure}
+    \include{figures/guard_table}
+    \caption{Percentage of guards before and after optimization for different benchmarks}
+    \label{fig:guard_percent}
+\end{figure}
 
-The paper is structured as follows:
+The set of central concepts upon which this work is based is described in
+Section~\ref{sec:Background}, such as the PyPy project, the RPython language
+and its meta-tracing JIT. Based on these concepts in Section~\ref{sec:Resume
+Data} we proceed to describe for PyPy's tracing JIT the details of guards in
+the frontend\bivab{better term for this?} related to recording and storing the
+information required to restore the interpreter state in case of a guard
+failure, once the frontend has traced and optimized a loop it invokes the
+backend to compile the operations to machine code, Section \ref{sec:Guards in
+the Backend} describes the low-level aspects of how guards are implemented in
+the JIT-backend. The frequency of guards and the overhead associated with the
+implementation described in this paper is discussed in
+Section~\ref{sec:evaluation}. Section~\ref{sec:Related Work} presents an
+overview about how guards are treated in the context of other just-in-time
+compilers. Finally Section~\ref{sec:Conclusion} summarizes our conclusions and
+gives an outlook on further research topics.
+
 
 \section{Background}
 \label{sec:Background}
@@ -200,7 +237,7 @@
     \label{fig:trace-log}
 \end{figure}
 
-\section{Resume Data}
+\section{Guards in the Frontend} %{Resume Data}
 \label{sec:Resume Data}
 
 Since tracing linearizes control flow by following one concrete execution,
@@ -364,23 +401,24 @@
 \section{Guards in the Backend}
 \label{sec:Guards in the Backend}
 
-After optimization the resulting trace is handed to the backend to be compiled
-to machine code. The compilation phase consists of two passes over the lists of
-instructions, a backwards pass to calculate live ranges of IR-level variables
-and a forward one to emit the instructions. During the forward pass IR-level
-variables are assigned to registers and stack locations by the register
-allocator according to the requirements of the to be emitted instructions.
-Eviction/spilling is performed based on the live range information collected in
-the first pass. Each IR instruction is transformed into one or more machine
-level instructions that implement the required semantics, operations withouth
-side effects whose result is not used are not emitted. Guards instructions are
-transformed into fast checks at the machine code level that verify the
-corresponding condition.  In cases the value being checked by the guard is not
-used anywhere else the guard and the operation producing the value can merged,
-reducing even more the overhead of the guard. Figure \ref{fig:trace-compiled}
-shows how an \texttt{int\_eq} operation followed by a guard that checks the
-result of the operation are compiled to pseudo-assembler if the operation and
-the guard are compiled separated or if they are merged.
+After optimization the resulting trace is handed to the over platform specific
+backend to be compiled to machine code. The compilation phase consists of two
+passes over the lists of instructions, a backwards pass to calculate live
+ranges of IR-level variables and a forward one to emit the instructions. During
+the forward pass IR-level variables are assigned to registers and stack
+locations by the register allocator according to the requirements of the to be
+emitted instructions.  Eviction/spilling is performed based on the live range
+information collected in the first pass. Each IR instruction is transformed
+into one or more machine level instructions that implement the required
+semantics, operations withouth side effects whose result is not used are not
+emitted. Guards instructions are transformed into fast checks at the machine
+code level that verify the corresponding condition.  In cases the value being
+checked by the guard is not used anywhere else the guard and the operation
+producing the value can merged, reducing even more the overhead of the guard.
+Figure \ref{fig:trace-compiled} shows how an \texttt{int\_eq} operation
+followed by a guard that checks the result of the operation are compiled to
+pseudo-assembler if the operation and the guard are compiled separated or if
+they are merged.
 
 \bivab{Figure needs better formatting}
 \begin{figure}[ht]
@@ -426,7 +464,7 @@
 more detail here?!} This encoding needs to be as compact as possible to
 maintain an acceptable memory profile.
 
-\bivab{example for low-level resume data goes here}
+\todo{example for low-level resume data showing how the current encoding works?}
 
 Second a piece of code is generated for each guard that acts as a trampoline.
 Guards are implemented as a conditional jump to this trampoline. In case the
@@ -445,9 +483,11 @@
 As in previous sections the underlying idea for the design of guards is to have
 a fast on-trace profile and a potentially slow one in the bail-out case where
 the execution takes one of the side exits due to a guard failure. At the same
-time the data stored in the backend needed to rebuild the state should be be
-as compact as possible to reduce the memory overhead produced by the large
-number of guards\bivab{back this}.
+time the data stored in the backend needed to rebuild the state needs to be as
+compact as possible to reduce the memory overhead produced by the large number
+of guards, the numbers in Figure~\ref{fig:backend_data} illustrate that the
+compressed encoding currently has about 15\% to 25\% of the size of of the
+generated instructions on x86.
 
 As explained in previous sections, when a specific guard has failed often enough
 a new trace, referred to as a \emph{bridge}, starting from this guard is recorded and
@@ -467,12 +507,23 @@
 reconstruction all bindings are restored to the state as they were in the
 original loop up to the guard.
 
-Once the bridge has been compiled the trampoline method stub is redirected to
-the code of the bridge. In future if the guard fails again it jumps to the code
-compiled for the bridge instead of bailing out. Once the guard has been
-compiled and attached to the loop the guard becomes just a point where
-control-flow can split. The loop after the guard and the bridge are just
-conditional paths. \todo{add figure of trace with trampoline and patched guard to a bridge}
+Once the bridge has been compiled the guard that led to compiling the birdge is
+patched to redirect control flow to the bridge in case the check fails. In
+future if the guard fails again it jumps to the code compiled for the bridge
+instead of bailing out. Once the guard has been compiled and attached to the
+loop the guard becomes just a point where control-flow can split. The loop
+after the guard and the bridge are just conditional paths.
+Figure~\ref{fig:trampoline} shows a digram of a compiled loop with two guards,
+Guard \#1 jumps to the trampoline, loads the \texttt{low level resume data} and
+then calls the compensation code, whereas Guard \#2 has already been patched
+and directly jumps to the corresponding bridge. The bridge also contains two
+guards that work based on the same principles.
+\begin{figure}
+\centering
+\includegraphics[width=0.5\textwidth]{figures/loop_bridge.pdf}
+\caption{Trace control flow in case of guard failures with and without bridges}
+\label{fig:trampoline}
+\end{figure}
 %* Low level handling of guards
 %   * Fast guard checks v/s memory usage
 %   * memory efficient encoding of low level resume data
@@ -487,15 +538,16 @@
 \section{Evaluation}
 \label{sec:evaluation}
 
-The following analysis is based on a selection of benchmarks taken from the set
-of benchmarks used to measure the performance of PyPy as can be seen
-on.\footnote{http://speed.pypy.org/} The benchmarks were taken from the PyPy benchmarks
-repository using revision
+The results presented in this section are based on numbers gathered by running
+a subset of the standard PyPy benchmarks. The PyPy benchmarks are used to
+measure the performance of PyPy and are composed of a series of
+micro-benchmarks and larger programs.\footnote{http://speed.pypy.org/} The
+benchmarks were taken from the PyPy benchmarks repository using revision
 \texttt{ff7b35837d0f}.\footnote{https://bitbucket.org/pypy/benchmarks/src/ff7b35837d0f}
 The benchmarks were run on a version of PyPy based on the
-tag~\texttt{release-1.9} and patched to collect additional data about the
+tag~\texttt{0b77afaafdd0} and patched to collect additional data about the
 guards in the machine code
-backends.\footnote{https://bitbucket.org/pypy/pypy/src/release-1.9} All
+backends.\footnote{https://bitbucket.org/pypy/pypy/src/0b77afaafdd0} All
 benchmark data was collected on a MacBook Pro 64 bit running Max OS 10.8 with
 the loop unrolling optimization disabled.\footnote{Since loop unrolling
 duplicates the body of loops it would no longer be possible to meaningfully
@@ -504,12 +556,25 @@
 affected much by its absence.}
 
 Figure~\ref{fig:benchmarks} shows the total number of operations that are
-recorded during tracing for each of the benchmarks on what percentage of these
-are guards. Figure~\ref{fig:benchmarks} also shows the number of operations left
-after performing the different trace optimizations done by the trace optimizer,
-such as xxx. The last columns show the overall optimization rate and the
-optimization rate specific for guard operations, showing what percentage of the
-operations was removed during the optimizations phase.
+recorded during tracing for each of the benchmarks and what percentage of these
+are guards. Figure~\ref{fig:benchmarks} also shows the number of operations
+left after performing the different trace optimizations done by the trace
+optimizer, such as xxx. The last columns show the overall optimization rate and
+the optimization rate specific for guard operations, showing what percentage of
+the operations were removed during the optimizations phase.
+Figure~\ref{fig:benchmarks} shows that as can also be seen on
+Figure~\ref{fig:guard_percent} the optimization rate for guards is on par with
+the average optimization rate for all operations in a trace. After optimization
+the amount of guards left in the trace still represents about 15.18\% to
+20.22\% of the operation, a bit less than before the optimization where guards
+represented between 15.85\% and 22.48\% of the operations. After performing the
+optimizations the most common operations are those that are difficult or
+impossible to optimize, such as JIT internal operations and different types of
+calls. These account for 14.53\% to 18.84\% of the operations before and for
+28.69\% to 46.60\% of the operations after optimization. These numbers show
+that about one fifth of the operations, making guards one of the most common
+operations, that are compiled are guards and have associated with them the
+high- and low-level datastructes that are reconstruct the state.
 
 \begin{figure*}
     \include{figures/benchmarks_table}
@@ -517,18 +582,31 @@
     \label{fig:benchmarks}
 \end{figure*}
 
-\todo{resume data size estimates on 64bit}
 \todo{figure about failure counts of guards (histogram?)}
-\todo{integrate high level resume data size into Figure \ref{fig:backend_data}}
 \todo{add resume data sizes without sharing}
 \todo{add a footnote about why guards have a threshold of 100}
 
-Figure~\ref{fig:backend_data} shows
-the total memory consumption of the code and of the data generated by the machine code
-backend for the different benchmarks mentioned above. Meaning the operations
-left after optimization take the space shown in Figure~\ref{fig:backend_data}
-after being compiled. Also the additional data stored for the guards to be used
-in case of a bailout and attaching a bridge.
+The overhead that is incurred by the JIT to manage the \texttt{resume data},
+the \texttt{low-level resume data} and the generated machine code is shown in
+Figure~\ref{fig:backend_data}. It shows the total memory consumption of the
+code and of the data generated by the machine code backend for the different
+benchmarks mentioned above. The size of the machine code is composed of the
+size of the compiled operations, the trampolines generated for the guards and a
+set of support functions that are generated when the JIT starts and are shared
+by all compiled traces. The size of the \texttt{low-level resume data} is the
+size of the registers and stack to IR-level variable mappings and finally the
+size of the \texttt{resume data} is an approximation of the size of the
+compressed high-level resume data. While the \texttt{low-level resume data} has
+a size of about 15\% to 20\% of the generated instructions the \texttt{resume
+data} is even in the compressed form larger than the generated machine code.
+
+Tracing JITs compilers only compile a subset of the executed program so the
+amount of generated machine code will be smaller than for function based JITs.
+At the same time there is a several times larger overhead for keeping the
+resume information for the guards. The generated machine code accounts for
+20.21\% to 37.97\% of the size required for storing the different kinds of
+resume data.
+
 \begin{figure*}
     \include{figures/backend_table}
     \caption{Total size of generated machine code and guard data}
@@ -549,10 +627,14 @@
    * Measure the of guards and how many of these ever fail
 
 \section{Related Work}
+\label{sec:Related Work}
 
 \subsection{Guards in Other Tracing JITs}
 \label{sub:Guards in Other Tracing JITs}
 
+Guards as described are a concept associated with tracing just-in-time
+compilers to represent possible divergent control flow paths.
+
 SPUR~\cite{bebenita_spur:_2010} is a tracing JIT compiler
 for a C\# virtual machine.
 It handles guards by always generating code for every one of them
@@ -561,13 +643,42 @@
 of the unoptimized code,
 the transfer code is quite large.
 
-\bivab{mention Gal et al.~\cite{Gal:2009ux} trace stitching}
-and also mention \bivab{Dynamo's fragment linking~\cite{Bala:2000wv}} in
-relation to the low-level guard handling.
+Mike Pall, the author of LuaJIT describes in a post to the lua-users mailing
+list different technologies and techniques used in the implementation of
+LuaJIT~\cite{Pall:2009}.\todo{decide if LuaJIT is a footnote or a reference and
+fix website citation} Pall explains that guards in LuaJIT use a datastucture
+called snapshots, similar to PyPy's resume data, to store the information about
+how to rebuild the state from a side-exit using the information in the snapshot
+and the machine execution state. Pall also acknowledges that snapshot for
+guards are associated with a large memory footprint. The solution used in
+LuaJIT is to store sparse snapshots, avoiding the creation of snapshots for
+every guard to reduce memory pressure. Snapshots are only created for guards
+after updates to the global state, after control flow points from the original
+program and for guards that are likely to fail. As an outlook Pall mentions the
+plans to switch to compressed snapshots to further reduce redundancy.
 
-\todo{look into tracing papers for information about guards and deoptimization}
-LuaJIT \todo{link to mailing list discussion}
-http://lua-users.org/lists/lua-l/2009-11/msg00089.html
+Linking side exits to pieces of later compiled machine code was described first
+in the context of Dynamo~\cite{Bala:2000wv} under the name of Fragment Linking.
+Once a new hot trace is emitted into the fragment cache it is linked to side
+exit that led to the compilation. Fragment Linking avoids the performance
+penalty involved in leaving the compiled and it to remove the compensation
+code used when restoring the machine state on a side exit.
+
+In~\cite{Gal:2006} Gal et. al describe that in the HotpathVM they experimented
+with having one generic compensation code block, like the RPython JIT, that
+uses a register variable mapping to restore the interpreter state. Later this
+was replaced by generating compensation code for each guard which produced a
+lower overhead in their benchmarks. HotpathVM also records secondary traces
+starting from failing guards that are connected directly to the original trace.
+Secondary traces are compiled by first restoring the register allocator state to
+the state at the side exit. The information is retrieved from a mapping stored
+in the guard that maps machine level registers and stack to Java level stack
+and variables.
+
+Gal et. al~\cite{Gal:2009ux} write about how TraceMonkey uses trace stitching
+to avoid th overhead of returning to the trace monitor and calling another
+trace when taking a side exit. In their approach it is required to write live
+values to an activation record before entering the new trace.
 
 % subsection Guards in Other Tracing JITs (end)
 
@@ -609,14 +720,22 @@
 
 
 % subsection Deoptimization in Method-Based JITs (end)
-
+% section Related Work (end)
 
 
 \section{Conclusion}
+\label{sec:Conclusion}
 
 \todo{conclusion}
 
 \section*{Acknowledgements}
+\section*{Appendix}
+\begin{figure*}
+    \include{figures/ops_count_table}
+    \caption{Relative numbers of operations in the traces generated for
+    different benchmarks}
+    \label{fig:ops_count}
+\end{figure*}
 \bibliographystyle{abbrv}
 \bibliography{zotero,paper}
 \listoftodos
diff --git a/talk/vmil2012/tool/build_tables.py b/talk/vmil2012/tool/build_tables.py
--- a/talk/vmil2012/tool/build_tables.py
+++ b/talk/vmil2012/tool/build_tables.py
@@ -41,6 +41,25 @@
     output = render_table(template, head, sorted(table))
     write_table(output, texfile)
 
+def build_guard_table(csvfiles, texfile, template):
+    assert len(csvfiles) == 1
+    lines = getlines(csvfiles[0])
+    table = []
+    head = ['Benchmark', 'guards b/o in \%', 'guards a/o in \%']
+
+    keys = 'numeric set get rest new guard '.split()
+    for bench in lines:
+        ops = {'before': sum(int(bench['%s before' % s]) for s in keys),
+                'after': sum(int(bench['%s after' % s]) for s in keys)}
+
+        res = [bench['bench'].replace('_', '\\_'),]
+        for t in ('before', 'after'):
+            o = int(bench['guard %s' % t])
+            res.append('%.2f ' % (o / ops[t] * 100))
+        table.append(res)
+    output = render_table(template, head, sorted(table))
+    write_table(output, texfile)
+
 
 
 def build_benchmarks_table(csvfiles, texfile, template):
@@ -89,24 +108,31 @@
 
 def build_backend_count_table(csvfiles, texfile, template):
     lines = getlines(csvfiles[0])
+    resume_lines = getlines(csvfiles[1])
+    resumedata = {}
+    for l in resume_lines:
+        resumedata[l['bench']] = l
 
     head = ['Benchmark',
             'Machine code size (kB)',
+            'hl resume data (kB)',
             'll resume data (kB)',
-            '\\% of machine code size']
+            'machine code resume data relation in \\%']
 
     table = []
     # collect data
     for bench in lines:
+        name = bench['bench']
         bench['bench'] = bench['bench'].replace('_', '\\_')
-        keys = ['bench', 'asm size', 'guard map size']
         gmsize = float(bench['guard map size'])
         asmsize = float(bench['asm size'])
-        rel = "%.2f" % (gmsize / asmsize * 100,)
+        rdsize = float(resumedata[name]['total resume data size'])
+        rel = "%.2f" % (asmsize / (gmsize + rdsize) * 100,)
         table.append([
             bench['bench'],
+            "%.2f" % (asmsize,),
+            "%.2f" % (rdsize,),
             "%.2f" % (gmsize,),
-            "%.2f" % (asmsize,),
             rel])
     output = render_table(template, head, sorted(table))
     write_table(output, texfile)
@@ -130,9 +156,11 @@
         'benchmarks_table.tex':
             (['summary.csv', 'bridge_summary.csv'], build_benchmarks_table),
         'backend_table.tex':
-            (['backend_summary.csv'], build_backend_count_table),
+            (['backend_summary.csv', 'resume_summary.csv'], build_backend_count_table),
         'ops_count_table.tex':
             (['summary.csv'], build_ops_count_table),
+        'guard_table.tex':
+            (['summary.csv'], build_guard_table),
         }
 
 


More information about the pypy-commit mailing list