{"file":"pdf-inputs/sample-scientific-2.pdf","pages":[{"blocks":[{"type":"text","bbox":{"x":80,"y":74,"w":449,"h":43},"lines":[{"wmode":0,"bbox":{"x":80,"y":74,"w":449,"h":23},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":17},"x":80,"y":91,"text":"Trace-based Just-in-Time Type Specialization for Dynamic"},{"wmode":0,"bbox":{"x":263,"y":94,"w":82,"h":23},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":17},"x":263,"y":111,"text":"Languages"}]},{"type":"text","bbox":{"x":68,"y":136,"w":473,"h":39},"lines":[{"wmode":0,"bbox":{"x":120,"y":136,"w":55,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":120,"y":147,"text":"Andreas Gal"},{"wmode":0,"bbox":{"x":175,"y":136,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":175,"y":143,"text":"∗"},{"wmode":0,"bbox":{"x":180,"y":137,"w":6,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":180,"y":143,"text":"+"},{"wmode":0,"bbox":{"x":187,"y":136,"w":65,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":187,"y":147,"text":", Brendan Eich"},{"wmode":0,"bbox":{"x":252,"y":136,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":252,"y":143,"text":"∗"},{"wmode":0,"bbox":{"x":257,"y":136,"w":61,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":257,"y":147,"text":", Mike Shaver"},{"wmode":0,"bbox":{"x":318,"y":136,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":318,"y":143,"text":"∗"},{"wmode":0,"bbox":{"x":323,"y":136,"w":77,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":323,"y":147,"text":", David Anderson"},{"wmode":0,"bbox":{"x":400,"y":136,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":400,"y":143,"text":"∗"},{"wmode":0,"bbox":{"x":405,"y":136,"w":76,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":405,"y":147,"text":", David Mandelin"},{"wmode":0,"bbox":{"x":482,"y":136,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":482,"y":143,"text":"∗"},{"wmode":0,"bbox":{"x":487,"y":136,"w":2,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":487,"y":147,"text":","},{"wmode":0,"bbox":{"x":93,"y":149,"w":114,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":93,"y":160,"text":"Mohammad R. Haghighat"},{"wmode":0,"bbox":{"x":207,"y":150,"w":4,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":207,"y":156,"text":"$"},{"wmode":0,"bbox":{"x":212,"y":149,"w":65,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":212,"y":160,"text":", Blake Kaplan"},{"wmode":0,"bbox":{"x":277,"y":149,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":277,"y":156,"text":"∗"},{"wmode":0,"bbox":{"x":282,"y":149,"w":73,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":282,"y":160,"text":", Graydon Hoare"},{"wmode":0,"bbox":{"x":355,"y":149,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":355,"y":156,"text":"∗"},{"wmode":0,"bbox":{"x":360,"y":149,"w":67,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":360,"y":160,"text":", Boris Zbarsky"},{"wmode":0,"bbox":{"x":428,"y":149,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":428,"y":156,"text":"∗"},{"wmode":0,"bbox":{"x":432,"y":149,"w":76,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":432,"y":160,"text":", Jason Orendorff"},{"wmode":0,"bbox":{"x":509,"y":149,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":509,"y":156,"text":"∗"},{"wmode":0,"bbox":{"x":513,"y":149,"w":2,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":513,"y":160,"text":","},{"wmode":0,"bbox":{"x":68,"y":162,"w":70,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":68,"y":173,"text":"Jesse Ruderman"},{"wmode":0,"bbox":{"x":139,"y":162,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":139,"y":169,"text":"∗"},{"wmode":0,"bbox":{"x":143,"y":162,"w":63,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":143,"y":173,"text":", Edwin Smith"},{"wmode":0,"bbox":{"x":206,"y":163,"w":7,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":206,"y":169,"text":"#"},{"wmode":0,"bbox":{"x":214,"y":162,"w":72,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":214,"y":173,"text":", Rick Reitmaier"},{"wmode":0,"bbox":{"x":286,"y":163,"w":7,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":286,"y":169,"text":"#"},{"wmode":0,"bbox":{"x":294,"y":162,"w":83,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":294,"y":173,"text":", Michael Bebenita"},{"wmode":0,"bbox":{"x":377,"y":163,"w":6,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":377,"y":169,"text":"+"},{"wmode":0,"bbox":{"x":384,"y":162,"w":66,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":384,"y":173,"text":", Mason Chang"},{"wmode":0,"bbox":{"x":451,"y":163,"w":14,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":451,"y":169,"text":"+#"},{"wmode":0,"bbox":{"x":465,"y":162,"w":69,"h":13},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":10},"x":465,"y":173,"text":", Michael Franz"},{"wmode":0,"bbox":{"x":534,"y":163,"w":6,"h":7},"font":{"name":"TLZTLU+CMR8","family":"serif","weight":"normal","style":"normal","size":7},"x":534,"y":169,"text":"+"}]},{"type":"text","bbox":{"x":266,"y":179,"w":77,"h":11},"lines":[{"wmode":0,"bbox":{"x":266,"y":179,"w":73,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":266,"y":187,"text":"Mozilla Corporation"},{"wmode":0,"bbox":{"x":339,"y":179,"w":3,"h":10},"font":{"name":"SJLUHL+CMSY6","family":"serif","weight":"normal","style":"italic","size":5},"x":339,"y":184,"text":"∗"}]},{"type":"text","bbox":{"x":90,"y":190,"w":428,"h":15},"lines":[{"wmode":0,"bbox":{"x":90,"y":190,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":90,"y":197,"text":"{"},{"wmode":0,"bbox":{"x":95,"y":191,"w":362,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":95,"y":197,"text":"gal,brendan,shaver,danderson,dmandelin,mrbkap,graydon,bz,jorendorff,jruderman"},{"wmode":0,"bbox":{"x":458,"y":190,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":458,"y":197,"text":"}"},{"wmode":0,"bbox":{"x":462,"y":191,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":462,"y":197,"text":"@mozilla.com"}]},{"type":"text","bbox":{"x":267,"y":205,"w":75,"h":10},"lines":[{"wmode":0,"bbox":{"x":267,"y":205,"w":69,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":267,"y":214,"text":"Adobe Corporation"},{"wmode":0,"bbox":{"x":336,"y":205,"w":5,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":336,"y":210,"text":"#"}]},{"type":"text","bbox":{"x":236,"y":217,"w":136,"h":15},"lines":[{"wmode":0,"bbox":{"x":236,"y":217,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":236,"y":224,"text":"{"},{"wmode":0,"bbox":{"x":241,"y":217,"w":80,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":241,"y":224,"text":"edwsmith,rreitmai"},{"wmode":0,"bbox":{"x":321,"y":217,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":321,"y":224,"text":"}"},{"wmode":0,"bbox":{"x":326,"y":217,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":326,"y":224,"text":"@adobe.com"}]},{"type":"text","bbox":{"x":271,"y":232,"w":65,"h":10},"lines":[{"wmode":0,"bbox":{"x":271,"y":232,"w":62,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":271,"y":240,"text":"Intel Corporation"},{"wmode":0,"bbox":{"x":333,"y":232,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":333,"y":236,"text":"$"}]},{"type":"text","bbox":{"x":229,"y":243,"w":150,"h":15},"lines":[{"wmode":0,"bbox":{"x":229,"y":243,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":229,"y":250,"text":"{"},{"wmode":0,"bbox":{"x":234,"y":244,"w":94,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":234,"y":250,"text":"mohammad.r.haghighat"},{"wmode":0,"bbox":{"x":328,"y":243,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":328,"y":250,"text":"}"},{"wmode":0,"bbox":{"x":333,"y":244,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":333,"y":250,"text":"@intel.com"}]},{"type":"text","bbox":{"x":246,"y":258,"w":117,"h":10},"lines":[{"wmode":0,"bbox":{"x":246,"y":258,"w":111,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":246,"y":266,"text":"University of California, Irvine"},{"wmode":0,"bbox":{"x":357,"y":258,"w":5,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":357,"y":262,"text":"+"}]},{"type":"text","bbox":{"x":232,"y":269,"w":145,"h":15},"lines":[{"wmode":0,"bbox":{"x":232,"y":269,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":232,"y":276,"text":"{"},{"wmode":0,"bbox":{"x":236,"y":270,"w":98,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":236,"y":276,"text":"mbebenit,changm,franz"},{"wmode":0,"bbox":{"x":335,"y":269,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":335,"y":276,"text":"}"},{"wmode":0,"bbox":{"x":340,"y":270,"w":37,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":340,"y":276,"text":"@uci.edu"}]},{"type":"text","bbox":{"x":53,"y":333,"w":40,"h":14},"lines":[{"wmode":0,"bbox":{"x":53,"y":333,"w":40,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":53,"y":344,"text":"Abstract"}]},{"type":"text","bbox":{"x":53,"y":349,"w":239,"h":140},"lines":[{"wmode":0,"bbox":{"x":53,"y":349,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":358,"text":"Dynamic languages such as JavaScript are more difficult to com-"},{"wmode":0,"bbox":{"x":53,"y":359,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":368,"text":"pile than statically typed ones. Since no concrete type information"},{"wmode":0,"bbox":{"x":53,"y":369,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":377,"text":"is available, traditional compilers need to emit generic code that can"},{"wmode":0,"bbox":{"x":53,"y":379,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":387,"text":"handle all possible type combinations at runtime. We present an al-"},{"wmode":0,"bbox":{"x":53,"y":389,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":397,"text":"ternative compilation technique for dynamically-typed languages"},{"wmode":0,"bbox":{"x":53,"y":399,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":407,"text":"that identifies frequently executed loop traces at run-time and then"},{"wmode":0,"bbox":{"x":53,"y":409,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":417,"text":"generates machine code on the fly that is specialized for the ac-"},{"wmode":0,"bbox":{"x":53,"y":419,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":427,"text":"tual dynamic types occurring on each path through the loop. Our"},{"wmode":0,"bbox":{"x":53,"y":429,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":437,"text":"method provides cheap inter-procedural type specialization, and an"},{"wmode":0,"bbox":{"x":53,"y":439,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":447,"text":"elegant and efficient way of incrementally compiling lazily discov-"},{"wmode":0,"bbox":{"x":53,"y":449,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":457,"text":"ered alternative paths through nested loops. We have implemented"},{"wmode":0,"bbox":{"x":53,"y":459,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":467,"text":"a dynamic compiler for JavaScript based on our technique and we"},{"wmode":0,"bbox":{"x":53,"y":469,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":477,"text":"have measured speedups of 10x and more for certain benchmark"},{"wmode":0,"bbox":{"x":53,"y":479,"w":36,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":487,"text":"programs."}]},{"type":"text","bbox":{"x":53,"y":494,"w":239,"h":21},"lines":[{"wmode":0,"bbox":{"x":53,"y":494,"w":133,"h":11},"font":{"name":"NWBJZL+NimbusRomNo9L-MediItal","family":"serif","weight":"bold","style":"italic","size":8},"x":53,"y":503,"text":"Categories and Subject Descriptors"},{"wmode":0,"bbox":{"x":196,"y":494,"w":26,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":196,"y":503,"text":"D.3.4 ["},{"wmode":0,"bbox":{"x":222,"y":494,"w":70,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":222,"y":503,"text":"Programming Lan-"},{"wmode":0,"bbox":{"x":53,"y":504,"w":25,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":53,"y":513,"text":"guages"},{"wmode":0,"bbox":{"x":79,"y":504,"w":57,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":79,"y":513,"text":"]: Processors —"},{"wmode":0,"bbox":{"x":136,"y":504,"w":145,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":136,"y":513,"text":" Incremental compilers, code generation"},{"wmode":0,"bbox":{"x":281,"y":504,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":281,"y":513,"text":"."}]},{"type":"text","bbox":{"x":53,"y":520,"w":239,"h":21},"lines":[{"wmode":0,"bbox":{"x":53,"y":520,"w":55,"h":11},"font":{"name":"NWBJZL+NimbusRomNo9L-MediItal","family":"serif","weight":"bold","style":"italic","size":8},"x":53,"y":528,"text":"General Terms"},{"wmode":0,"bbox":{"x":118,"y":520,"w":174,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":118,"y":528,"text":"Design, Experimentation, Measurement, Perfor-"},{"wmode":0,"bbox":{"x":53,"y":530,"w":25,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":538,"text":"mance."}]},{"type":"text","bbox":{"x":53,"y":545,"w":216,"h":11},"lines":[{"wmode":0,"bbox":{"x":53,"y":545,"w":35,"h":11},"font":{"name":"NWBJZL+NimbusRomNo9L-MediItal","family":"serif","weight":"bold","style":"italic","size":8},"x":53,"y":554,"text":"Keywords"},{"wmode":0,"bbox":{"x":98,"y":546,"w":171,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":98,"y":554,"text":"JavaScript, just-in-time compilation, trace trees."}]},{"type":"text","bbox":{"x":53,"y":566,"w":78,"h":14},"lines":[{"wmode":0,"bbox":{"x":53,"y":566,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":53,"y":576,"text":"1."},{"wmode":0,"bbox":{"x":73,"y":566,"w":59,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":73,"y":576,"text":"Introduction"}]},{"type":"text","bbox":{"x":53,"y":582,"w":239,"h":50},"lines":[{"wmode":0,"bbox":{"x":53,"y":582,"w":71,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":53,"y":590,"text":"Dynamic languages"},{"wmode":0,"bbox":{"x":125,"y":582,"w":168,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":125,"y":590,"text":" such as JavaScript, Python, and Ruby, are pop-"},{"wmode":0,"bbox":{"x":53,"y":592,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":600,"text":"ular since they are expressive, accessible to non-experts, and make"},{"wmode":0,"bbox":{"x":53,"y":602,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":610,"text":"deployment as easy as distributing a source file. They are used for"},{"wmode":0,"bbox":{"x":53,"y":612,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":620,"text":"small scripts as well as for complex applications. JavaScript, for"},{"wmode":0,"bbox":{"x":53,"y":622,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":630,"text":"example, is the de facto standard for client-side web programming"}]},{"type":"text","bbox":{"x":53,"y":665,"w":239,"h":62},"lines":[{"wmode":0,"bbox":{"x":53,"y":665,"w":239,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":53,"y":672,"text":"Permission to make digital or hard copies of all or part of this work for personal or"},{"wmode":0,"bbox":{"x":53,"y":673,"w":239,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":53,"y":680,"text":"classroom use is granted without fee provided that copies are not made or distributed"},{"wmode":0,"bbox":{"x":53,"y":681,"w":239,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":53,"y":688,"text":"for profit or commercial advantage and that copies bear this notice and the full citation"},{"wmode":0,"bbox":{"x":53,"y":689,"w":239,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":53,"y":696,"text":"on the first page. To copy otherwise, to republish, to post on servers or to redistribute"},{"wmode":0,"bbox":{"x":53,"y":697,"w":151,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":53,"y":704,"text":"to lists, requires prior specific permission and/or a fee."},{"wmode":0,"bbox":{"x":53,"y":707,"w":26,"h":8},"font":{"name":"FQDHWA+NimbusRomNo9L-Regu-Slant","family":"serif","weight":"normal","style":"italic","size":6},"x":53,"y":714,"text":"PLDI’09,"},{"wmode":0,"bbox":{"x":87,"y":707,"w":97,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":87,"y":714,"text":"June 15–20, 2009, Dublin, Ireland."},{"wmode":0,"bbox":{"x":53,"y":715,"w":35,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":53,"y":722,"text":"Copyright c"},{"wmode":0,"bbox":{"x":83,"y":716,"w":7,"h":12},"font":{"name":"ZRUSRO+CMSY7","family":"serif","weight":"normal","style":"italic","size":6},"x":83,"y":722,"text":"⃝"},{"wmode":0,"bbox":{"x":91,"y":715,"w":131,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":6},"x":91,"y":722,"text":" 2009 ACM 978-1-60558-392-1/09/06...$5.00"}]},{"type":"text","bbox":{"x":317,"y":335,"w":239,"h":389},"lines":[{"wmode":0,"bbox":{"x":317,"y":335,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":344,"text":"and is used for the application logic of browser-based productivity"},{"wmode":0,"bbox":{"x":317,"y":345,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":354,"text":"applications such as Google Mail, Google Docs and Zimbra Col-"},{"wmode":0,"bbox":{"x":317,"y":355,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":364,"text":"laboration Suite. In this domain, in order to provide a fluid user"},{"wmode":0,"bbox":{"x":317,"y":365,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":373,"text":"experience and enable a new generation of applications, virtual ma-"},{"wmode":0,"bbox":{"x":317,"y":375,"w":221,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":383,"text":"chines must provide a low startup time and high performance."},{"wmode":0,"bbox":{"x":328,"y":385,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":393,"text":"Compilers for statically typed languages rely on type informa-"},{"wmode":0,"bbox":{"x":317,"y":395,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":403,"text":"tion to generate efficient machine code. In a dynamically typed pro-"},{"wmode":0,"bbox":{"x":317,"y":405,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":413,"text":"gramming language such as JavaScript, the types of expressions"},{"wmode":0,"bbox":{"x":317,"y":415,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":423,"text":"may vary at runtime. This means that the compiler can no longer"},{"wmode":0,"bbox":{"x":317,"y":425,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":433,"text":"easily transform operations into machine instructions that operate"},{"wmode":0,"bbox":{"x":317,"y":435,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":443,"text":"on one specific type. Without exact type information, the compiler"},{"wmode":0,"bbox":{"x":317,"y":445,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":453,"text":"must emit slower generalized machine code that can deal with all"},{"wmode":0,"bbox":{"x":317,"y":455,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":463,"text":"potential type combinations. While compile-time static type infer-"},{"wmode":0,"bbox":{"x":317,"y":465,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":473,"text":"ence might be able to gather type information to generate opti-"},{"wmode":0,"bbox":{"x":317,"y":475,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":483,"text":"mized machine code, traditional static analysis is very expensive"},{"wmode":0,"bbox":{"x":317,"y":485,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":493,"text":"and hence not well suited for the highly interactive environment of"},{"wmode":0,"bbox":{"x":317,"y":495,"w":53,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":503,"text":"a web browser."},{"wmode":0,"bbox":{"x":328,"y":505,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":513,"text":"We present a trace-based compilation technique for dynamic"},{"wmode":0,"bbox":{"x":317,"y":515,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":523,"text":"languages that reconciles speed of compilation with excellent per-"},{"wmode":0,"bbox":{"x":317,"y":525,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":533,"text":"formance of the generated machine code. Our system uses a mixed-"},{"wmode":0,"bbox":{"x":317,"y":535,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":543,"text":"mode execution approach: the system starts running JavaScript in a"},{"wmode":0,"bbox":{"x":317,"y":545,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":553,"text":"fast-starting bytecode interpreter. As the program runs, the system"},{"wmode":0,"bbox":{"x":317,"y":554,"w":32,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":563,"text":"identifies"},{"wmode":0,"bbox":{"x":349,"y":554,"w":15,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":349,"y":563,"text":" hot"},{"wmode":0,"bbox":{"x":365,"y":554,"w":190,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":365,"y":563,"text":" (frequently executed) bytecode sequences, records"},{"wmode":0,"bbox":{"x":317,"y":564,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":573,"text":"them, and compiles them to fast native code. We call such a se-"},{"wmode":0,"bbox":{"x":317,"y":574,"w":85,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":583,"text":"quence of instructions a"},{"wmode":0,"bbox":{"x":402,"y":574,"w":20,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":402,"y":583,"text":" trace"},{"wmode":0,"bbox":{"x":422,"y":574,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":422,"y":583,"text":"."},{"wmode":0,"bbox":{"x":328,"y":584,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":593,"text":"Unlike method-based dynamic compilers, our dynamic com-"},{"wmode":0,"bbox":{"x":317,"y":594,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":603,"text":"piler operates at the granularity of individual loops. This design"},{"wmode":0,"bbox":{"x":317,"y":604,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":613,"text":"choice is based on the expectation that programs spend most of"},{"wmode":0,"bbox":{"x":317,"y":614,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"their time in hot loops. Even in dynamically typed languages, we"},{"wmode":0,"bbox":{"x":317,"y":624,"w":103,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"expect hot loops to be mostly"},{"wmode":0,"bbox":{"x":420,"y":624,"w":41,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":420,"y":633,"text":" type-stable"},{"wmode":0,"bbox":{"x":462,"y":624,"w":93,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":462,"y":633,"text":", meaning that the types of"},{"wmode":0,"bbox":{"x":317,"y":634,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":642,"text":"values are invariant. (12) For example, we would expect loop coun-"},{"wmode":0,"bbox":{"x":317,"y":644,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":652,"text":"ters that start as integers to remain integers for all iterations. When"},{"wmode":0,"bbox":{"x":317,"y":654,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":662,"text":"both of these expectations hold, a trace-based compiler can cover"},{"wmode":0,"bbox":{"x":317,"y":664,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":672,"text":"the program execution with a small number of type-specialized, ef-"},{"wmode":0,"bbox":{"x":317,"y":674,"w":90,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":682,"text":"ficiently compiled traces."},{"wmode":0,"bbox":{"x":328,"y":684,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":692,"text":"Each compiled trace covers one path through the program with"},{"wmode":0,"bbox":{"x":317,"y":694,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":702,"text":"one mapping of values to types. When the VM executes a compiled"},{"wmode":0,"bbox":{"x":317,"y":704,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":712,"text":"trace, it cannot guarantee that the same path will be followed"},{"wmode":0,"bbox":{"x":317,"y":714,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":722,"text":"or that the same types will occur in subsequent loop iterations."}]}]},{"blocks":[{"type":"text","bbox":{"x":53,"y":71,"w":239,"h":459},"lines":[{"wmode":0,"bbox":{"x":54,"y":71,"w":139,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":79,"text":"Hence, recording and compiling a trace"},{"wmode":0,"bbox":{"x":193,"y":71,"w":39,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":193,"y":79,"text":" speculates"},{"wmode":0,"bbox":{"x":232,"y":71,"w":60,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":232,"y":79,"text":" that the path and"},{"wmode":0,"bbox":{"x":54,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":89,"text":"typing will be exactly as they were during recording for subsequent"},{"wmode":0,"bbox":{"x":54,"y":91,"w":76,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":99,"text":"iterations of the loop."},{"wmode":0,"bbox":{"x":65,"y":101,"w":134,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":109,"text":"Every compiled trace contains all the"},{"wmode":0,"bbox":{"x":200,"y":101,"w":27,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":200,"y":109,"text":" guards"},{"wmode":0,"bbox":{"x":227,"y":101,"w":65,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":227,"y":109,"text":" (checks) required"},{"wmode":0,"bbox":{"x":54,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":119,"text":"to validate the speculation. If one of the guards fails (if control"},{"wmode":0,"bbox":{"x":54,"y":121,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":129,"text":"flow is different, or a value of a different type is generated), the"},{"wmode":0,"bbox":{"x":54,"y":131,"w":210,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":139,"text":"trace exits. If an exit becomes hot, the VM can record a"},{"wmode":0,"bbox":{"x":264,"y":131,"w":28,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":264,"y":139,"text":" branch"},{"wmode":0,"bbox":{"x":54,"y":141,"w":18,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":54,"y":149,"text":"trace"},{"wmode":0,"bbox":{"x":72,"y":141,"w":220,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":72,"y":149,"text":" starting at the exit to cover the new path. In this way, the VM"},{"wmode":0,"bbox":{"x":54,"y":151,"w":32,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":159,"text":"records a"},{"wmode":0,"bbox":{"x":86,"y":151,"w":36,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":86,"y":159,"text":" trace tree"},{"wmode":0,"bbox":{"x":122,"y":151,"w":156,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":122,"y":159,"text":" covering all the hot paths through the loop."},{"wmode":0,"bbox":{"x":65,"y":161,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":169,"text":"Nested loops can be difficult to optimize for tracing VMs. In"},{"wmode":0,"bbox":{"x":54,"y":171,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":179,"text":"a na¨ıve implementation, inner loops would become hot first, and"},{"wmode":0,"bbox":{"x":54,"y":181,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":189,"text":"the VM would start tracing there. When the inner loop exits, the"},{"wmode":0,"bbox":{"x":54,"y":191,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":199,"text":"VM would detect that a different branch was taken. The VM would"},{"wmode":0,"bbox":{"x":54,"y":201,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":209,"text":"try to record a branch trace, and find that the trace reaches not the"},{"wmode":0,"bbox":{"x":54,"y":211,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":219,"text":"inner loop header, but the outer loop header. At this point, the VM"},{"wmode":0,"bbox":{"x":54,"y":221,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":229,"text":"could continue tracing until it reaches the inner loop header again,"},{"wmode":0,"bbox":{"x":54,"y":231,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":239,"text":"thus tracing the outer loop inside a trace tree for the inner loop."},{"wmode":0,"bbox":{"x":54,"y":241,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":249,"text":"But this requires tracing a copy of the outer loop for every side exit"},{"wmode":0,"bbox":{"x":54,"y":251,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":259,"text":"and type combination in the inner loop. In essence, this is a form"},{"wmode":0,"bbox":{"x":54,"y":260,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":269,"text":"of unintended tail duplication, which can easily overflow the code"},{"wmode":0,"bbox":{"x":54,"y":270,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":279,"text":"cache. Alternatively, the VM could simply stop tracing, and give up"},{"wmode":0,"bbox":{"x":54,"y":280,"w":98,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":289,"text":"on ever tracing outer loops."},{"wmode":0,"bbox":{"x":65,"y":290,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":299,"text":"We solve the nested loop problem by recording"},{"wmode":0,"bbox":{"x":244,"y":290,"w":48,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":244,"y":299,"text":" nested trace"},{"wmode":0,"bbox":{"x":54,"y":300,"w":17,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":54,"y":309,"text":"trees"},{"wmode":0,"bbox":{"x":71,"y":300,"w":222,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":309,"text":". Our system traces the inner loop exactly as the na¨ıve version."},{"wmode":0,"bbox":{"x":54,"y":310,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":319,"text":"The system stops extending the inner tree when it reaches an outer"},{"wmode":0,"bbox":{"x":54,"y":320,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":329,"text":"loop, but then it starts a new trace at the outer loop header. When"},{"wmode":0,"bbox":{"x":54,"y":330,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":338,"text":"the outer loop reaches the inner loop header, the system tries to call"},{"wmode":0,"bbox":{"x":54,"y":340,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":348,"text":"the trace tree for the inner loop. If the call succeeds, the VM records"},{"wmode":0,"bbox":{"x":54,"y":350,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":358,"text":"the call to the inner tree as part of the outer trace and finishes"},{"wmode":0,"bbox":{"x":54,"y":360,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":368,"text":"the outer trace as normal. In this way, our system can trace any"},{"wmode":0,"bbox":{"x":54,"y":370,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":378,"text":"number of loops nested to any depth without causing excessive tail"},{"wmode":0,"bbox":{"x":54,"y":380,"w":42,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":388,"text":"duplication."},{"wmode":0,"bbox":{"x":65,"y":390,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":398,"text":"These techniques allow a VM to dynamically translate a pro-"},{"wmode":0,"bbox":{"x":54,"y":400,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":408,"text":"gram to nested, type-specialized trace trees. Because traces can"},{"wmode":0,"bbox":{"x":54,"y":410,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":418,"text":"cross function call boundaries, our techniques also achieve the ef-"},{"wmode":0,"bbox":{"x":54,"y":420,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":428,"text":"fects of inlining. Because traces have no internal control-flow joins,"},{"wmode":0,"bbox":{"x":54,"y":430,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":438,"text":"they can be optimized in linear time by a simple compiler (10)."},{"wmode":0,"bbox":{"x":54,"y":440,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":448,"text":"Thus, our tracing VM efficiently performs the same kind of op-"},{"wmode":0,"bbox":{"x":54,"y":450,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":458,"text":"timizations that would require interprocedural analysis in a static"},{"wmode":0,"bbox":{"x":54,"y":460,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":468,"text":"optimization setting. This makes tracing an attractive and effective"},{"wmode":0,"bbox":{"x":54,"y":470,"w":215,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":478,"text":"tool to type specialize even complex function call-rich code."},{"wmode":0,"bbox":{"x":65,"y":480,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":488,"text":"We implemented these techniques for an existing JavaScript in-"},{"wmode":0,"bbox":{"x":54,"y":490,"w":213,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":498,"text":"terpreter, SpiderMonkey. We call the resulting tracing VM"},{"wmode":0,"bbox":{"x":267,"y":490,"w":26,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":267,"y":498,"text":" Trace-"},{"wmode":0,"bbox":{"x":53,"y":500,"w":28,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":53,"y":508,"text":"Monkey"},{"wmode":0,"bbox":{"x":82,"y":500,"w":211,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":82,"y":508,"text":". TraceMonkey supports all the JavaScript features of Spi-"},{"wmode":0,"bbox":{"x":53,"y":510,"w":212,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":518,"text":"derMonkey, with a 2x-20x speedup for traceable programs."},{"wmode":0,"bbox":{"x":65,"y":520,"w":165,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":528,"text":"This paper makes the following contributions:"}]},{"type":"text","bbox":{"x":59,"y":538,"w":233,"h":21},"lines":[{"wmode":0,"bbox":{"x":59,"y":540,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":546,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":538,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":546,"text":" We explain an algorithm for dynamically forming trace trees to"},{"wmode":0,"bbox":{"x":66,"y":548,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":557,"text":"cover a program, representing nested loops as nested trace trees."}]},{"type":"text","bbox":{"x":59,"y":561,"w":244,"h":21},"lines":[{"wmode":0,"bbox":{"x":59,"y":564,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":570,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":561,"w":240,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":570,"text":" We explain how to speculatively generate efficient type-specialized"},{"wmode":0,"bbox":{"x":66,"y":572,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":581,"text":"code for traces from dynamic language programs."}]},{"type":"text","bbox":{"x":59,"y":585,"w":233,"h":31},"lines":[{"wmode":0,"bbox":{"x":59,"y":587,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":594,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":585,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":594,"text":" We validate our tracing techniques in an implementation based"},{"wmode":0,"bbox":{"x":66,"y":596,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":605,"text":"on the SpiderMonkey JavaScript interpreter, achieving 2x-20x"},{"wmode":0,"bbox":{"x":66,"y":606,"w":104,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":614,"text":"speedups on many programs."}]},{"type":"text","bbox":{"x":53,"y":625,"w":239,"h":100},"lines":[{"wmode":0,"bbox":{"x":65,"y":625,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":633,"text":"The remainder of this paper is organized as follows. Section 3 is"},{"wmode":0,"bbox":{"x":53,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":643,"text":"a general overview of trace tree based compilation we use to cap-"},{"wmode":0,"bbox":{"x":53,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":653,"text":"ture and compile frequently executed code regions. In Section 4"},{"wmode":0,"bbox":{"x":53,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":663,"text":"we describe our approach of covering nested loops using a num-"},{"wmode":0,"bbox":{"x":53,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":673,"text":"ber of individual trace trees. In Section 5 we describe our trace-"},{"wmode":0,"bbox":{"x":53,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":683,"text":"compilation based speculative type specialization approach we use"},{"wmode":0,"bbox":{"x":53,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":693,"text":"to generate efficient machine code from recorded bytecode traces."},{"wmode":0,"bbox":{"x":53,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":703,"text":"Our implementation of a dynamic type-specializing compiler for"},{"wmode":0,"bbox":{"x":53,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":713,"text":"JavaScript is described in Section 6. Related work is discussed in"},{"wmode":0,"bbox":{"x":53,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":723,"text":"Section 8. In Section 7 we evaluate our dynamic compiler based on"}]},{"type":"text","bbox":{"x":317,"y":71,"w":188,"h":58},"lines":[{"wmode":0,"bbox":{"x":317,"y":71,"w":155,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":78,"text":"1 for (var i = 2; i < 100; ++i) {"},{"wmode":0,"bbox":{"x":317,"y":81,"w":4,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":88,"text":"2"},{"wmode":0,"bbox":{"x":335,"y":81,"w":70,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":335,"y":88,"text":"if (!primes[i])"},{"wmode":0,"bbox":{"x":317,"y":91,"w":4,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":98,"text":"3"},{"wmode":0,"bbox":{"x":345,"y":91,"w":42,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":345,"y":98,"text":"continue;"},{"wmode":0,"bbox":{"x":317,"y":101,"w":4,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":108,"text":"4"},{"wmode":0,"bbox":{"x":335,"y":101,"w":169,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":335,"y":108,"text":"for (var k = i + i; i < 100; k += i)"},{"wmode":0,"bbox":{"x":317,"y":111,"w":4,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":118,"text":"5"},{"wmode":0,"bbox":{"x":345,"y":111,"w":84,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":345,"y":118,"text":"primes[k] = false;"},{"wmode":0,"bbox":{"x":317,"y":121,"w":14,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":128,"text":"6 }"}]},{"type":"text","bbox":{"x":317,"y":141,"w":239,"h":31},"lines":[{"wmode":0,"bbox":{"x":317,"y":141,"w":197,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":150,"text":"Figure 1. Sample program: sieve of Eratosthenes."},{"wmode":0,"bbox":{"x":514,"y":143,"w":31,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":514,"y":150,"text":" primes"},{"wmode":0,"bbox":{"x":546,"y":141,"w":9,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":546,"y":150,"text":" is"},{"wmode":0,"bbox":{"x":317,"y":151,"w":106,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":160,"text":"initialized to an array of 100"},{"wmode":0,"bbox":{"x":423,"y":153,"w":26,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":423,"y":160,"text":" false"},{"wmode":0,"bbox":{"x":450,"y":151,"w":105,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":450,"y":160,"text":" values on entry to this code"},{"wmode":0,"bbox":{"x":317,"y":161,"w":28,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":170,"text":"snippet."}]},{"type":"text","bbox":{"x":405,"y":212,"w":22,"h":5},"lines":[{"wmode":0,"bbox":{"x":405,"y":212,"w":20,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":405,"y":216,"text":"Interpret"},{"wmode":0,"bbox":{"x":426,"y":212,"w":1,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":426,"y":216,"text":" "}]},{"type":"text","bbox":{"x":403,"y":218,"w":24,"h":5},"lines":[{"wmode":0,"bbox":{"x":403,"y":218,"w":24,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":403,"y":222,"text":"Bytecodes"}]},{"type":"text","bbox":{"x":406,"y":258,"w":20,"h":5},"lines":[{"wmode":0,"bbox":{"x":406,"y":258,"w":18,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":406,"y":262,"text":"Monitor"},{"wmode":0,"bbox":{"x":425,"y":258,"w":1,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":425,"y":262,"text":" "}]},{"type":"text","bbox":{"x":335,"y":274,"w":22,"h":11},"lines":[{"wmode":0,"bbox":{"x":337,"y":274,"w":17,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":337,"y":278,"text":"Record"},{"wmode":0,"bbox":{"x":335,"y":280,"w":9,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":335,"y":284,"text":"LIR "},{"wmode":0,"bbox":{"x":344,"y":280,"w":3,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":344,"y":284,"text":"T"},{"wmode":0,"bbox":{"x":347,"y":280,"w":10,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":347,"y":284,"text":"race"}]},{"type":"text","bbox":{"x":473,"y":314,"w":21,"h":5},"lines":[{"wmode":0,"bbox":{"x":473,"y":314,"w":19,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":473,"y":318,"text":"Execute"},{"wmode":0,"bbox":{"x":493,"y":314,"w":1,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":493,"y":318,"text":" "}]},{"type":"text","bbox":{"x":465,"y":320,"w":36,"h":5},"lines":[{"wmode":0,"bbox":{"x":465,"y":320,"w":23,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":465,"y":324,"text":"Compiled "},{"wmode":0,"bbox":{"x":488,"y":320,"w":3,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":488,"y":324,"text":"T"},{"wmode":0,"bbox":{"x":491,"y":320,"w":10,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":491,"y":324,"text":"race"}]},{"type":"text","bbox":{"x":476,"y":274,"w":14,"h":5},"lines":[{"wmode":0,"bbox":{"x":476,"y":274,"w":13,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":476,"y":278,"text":"Enter"},{"wmode":0,"bbox":{"x":489,"y":274,"w":1,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":489,"y":278,"text":" "}]},{"type":"text","bbox":{"x":465,"y":280,"w":36,"h":5},"lines":[{"wmode":0,"bbox":{"x":465,"y":280,"w":23,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":465,"y":284,"text":"Compiled "},{"wmode":0,"bbox":{"x":488,"y":280,"w":3,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":488,"y":284,"text":"T"},{"wmode":0,"bbox":{"x":491,"y":280,"w":10,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":491,"y":284,"text":"race"}]},{"type":"text","bbox":{"x":335,"y":314,"w":22,"h":11},"lines":[{"wmode":0,"bbox":{"x":336,"y":314,"w":20,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":336,"y":318,"text":"Compile"},{"wmode":0,"bbox":{"x":335,"y":320,"w":9,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":335,"y":324,"text":"LIR "},{"wmode":0,"bbox":{"x":344,"y":320,"w":3,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":344,"y":324,"text":"T"},{"wmode":0,"bbox":{"x":347,"y":320,"w":10,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":347,"y":324,"text":"race"}]},{"type":"text","bbox":{"x":475,"y":353,"w":16,"h":5},"lines":[{"wmode":0,"bbox":{"x":475,"y":353,"w":14,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":475,"y":357,"text":"Leave"},{"wmode":0,"bbox":{"x":490,"y":353,"w":1,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":490,"y":357,"text":" "}]},{"type":"text","bbox":{"x":465,"y":359,"w":36,"h":5},"lines":[{"wmode":0,"bbox":{"x":465,"y":359,"w":23,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":465,"y":363,"text":"Compiled "},{"wmode":0,"bbox":{"x":488,"y":359,"w":3,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":488,"y":363,"text":"T"},{"wmode":0,"bbox":{"x":491,"y":359,"w":10,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":491,"y":363,"text":"race"}]},{"type":"text","bbox":{"x":401,"y":231,"w":12,"h":11},"lines":[{"wmode":0,"bbox":{"x":402,"y":231,"w":11,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":402,"y":235,"text":"loop "},{"wmode":0,"bbox":{"x":401,"y":237,"w":11,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":401,"y":241,"text":"edge"}]},{"type":"text","bbox":{"x":383,"y":271,"w":7,"h":5},"lines":[{"wmode":0,"bbox":{"x":383,"y":271,"w":7,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":383,"y":275,"text":"hot"}]},{"type":"text","bbox":{"x":377,"y":277,"w":19,"h":5},"lines":[{"wmode":0,"bbox":{"x":377,"y":277,"w":19,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":377,"y":281,"text":"loop/exit"}]},{"type":"text","bbox":{"x":335,"y":256,"w":13,"h":5},"lines":[{"wmode":0,"bbox":{"x":335,"y":256,"w":13,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":335,"y":260,"text":"abort "}]},{"type":"text","bbox":{"x":330,"y":262,"w":21,"h":5},"lines":[{"wmode":0,"bbox":{"x":330,"y":262,"w":21,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":330,"y":266,"text":"recording"}]},{"type":"text","bbox":{"x":353,"y":290,"w":19,"h":5},"lines":[{"wmode":0,"bbox":{"x":353,"y":290,"w":2,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":353,"y":294,"text":"fi"},{"wmode":0,"bbox":{"x":356,"y":290,"w":16,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":356,"y":294,"text":"nish at "}]},{"type":"text","bbox":{"x":348,"y":296,"w":27,"h":5},"lines":[{"wmode":0,"bbox":{"x":348,"y":296,"w":27,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":348,"y":300,"text":"loop header"}]},{"type":"text","bbox":{"x":441,"y":237,"w":35,"h":5},"lines":[{"wmode":0,"bbox":{"x":441,"y":237,"w":35,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":441,"y":241,"text":"cold/blacklisted"}]},{"type":"text","bbox":{"x":449,"y":243,"w":19,"h":5},"lines":[{"wmode":0,"bbox":{"x":449,"y":243,"w":19,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":449,"y":247,"text":"loop/exit"}]},{"type":"text","bbox":{"x":444,"y":258,"w":35,"h":5},"lines":[{"wmode":0,"bbox":{"x":444,"y":258,"w":35,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":444,"y":262,"text":"compiled trace "}]},{"type":"text","bbox":{"x":454,"y":264,"w":12,"h":5},"lines":[{"wmode":0,"bbox":{"x":454,"y":264,"w":12,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":454,"y":268,"text":"ready"}]},{"type":"text","bbox":{"x":425,"y":295,"w":34,"h":5},"lines":[{"wmode":0,"bbox":{"x":425,"y":295,"w":34,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":425,"y":299,"text":"loop edge with "}]},{"type":"text","bbox":{"x":428,"y":301,"w":26,"h":5},"lines":[{"wmode":0,"bbox":{"x":428,"y":301,"w":26,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":428,"y":305,"text":"same types"}]},{"type":"text","bbox":{"x":518,"y":343,"w":26,"h":5},"lines":[{"wmode":0,"bbox":{"x":518,"y":343,"w":26,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":518,"y":347,"text":"side exit to "}]},{"type":"text","bbox":{"x":515,"y":349,"w":30,"h":5},"lines":[{"wmode":0,"bbox":{"x":515,"y":349,"w":30,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":515,"y":353,"text":"existing trace"}]},{"type":"text","bbox":{"x":427,"y":340,"w":20,"h":5},"lines":[{"wmode":0,"bbox":{"x":427,"y":340,"w":20,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":427,"y":344,"text":"side exit,"}]},{"type":"text","bbox":{"x":418,"y":346,"w":37,"h":5},"lines":[{"wmode":0,"bbox":{"x":418,"y":346,"w":37,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":418,"y":350,"text":"no existing trace"}]},{"type":"text","bbox":{"x":507,"y":216,"w":24,"h":5},"lines":[{"wmode":0,"bbox":{"x":507,"y":216,"w":22,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":507,"y":220,"text":"Overhead"},{"wmode":0,"bbox":{"x":529,"y":216,"w":1,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":529,"y":220,"text":" "}]},{"type":"text","bbox":{"x":505,"y":229,"w":26,"h":5},"lines":[{"wmode":0,"bbox":{"x":505,"y":229,"w":26,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":505,"y":233,"text":"Interpreting"}]},{"type":"text","bbox":{"x":511,"y":241,"w":14,"h":5},"lines":[{"wmode":0,"bbox":{"x":511,"y":241,"w":14,"h":5},"font":{"name":"RBFYGC+Helvetica","family":"serif","weight":"normal","style":"normal","size":5},"x":511,"y":245,"text":"Native"}]},{"type":"text","bbox":{"x":504,"y":205,"w":29,"h":5},"lines":[{"wmode":0,"bbox":{"x":504,"y":205,"w":29,"h":5},"font":{"name":"TIVRUK+Helvetica-Bold","family":"serif","weight":"bold","style":"normal","size":5},"x":504,"y":209,"text":"Symbol Key"}]},{"type":"text","bbox":{"x":317,"y":390,"w":239,"h":90},"lines":[{"wmode":0,"bbox":{"x":317,"y":390,"w":34,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":398,"text":"Figure 2."},{"wmode":0,"bbox":{"x":351,"y":390,"w":204,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":351,"y":398,"text":" State machine describing the major activities of Trace-"},{"wmode":0,"bbox":{"x":317,"y":400,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":408,"text":"Monkey and the conditions that cause transitions to a new activ-"},{"wmode":0,"bbox":{"x":317,"y":410,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":418,"text":"ity. In the dark box, TM executes JS as compiled traces. In the"},{"wmode":0,"bbox":{"x":317,"y":420,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":428,"text":"light gray boxes, TM executes JS in the standard interpreter. White"},{"wmode":0,"bbox":{"x":317,"y":430,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":438,"text":"boxes are overhead. Thus, to maximize performance, we need to"},{"wmode":0,"bbox":{"x":317,"y":440,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":448,"text":"maximize time spent in the darkest box and minimize time spent in"},{"wmode":0,"bbox":{"x":317,"y":450,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":458,"text":"the white boxes. The best case is a loop where the types at the loop"},{"wmode":0,"bbox":{"x":317,"y":460,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":468,"text":"edge are the same as the types on entry–then TM can stay in native"},{"wmode":0,"bbox":{"x":317,"y":470,"w":97,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":478,"text":"code until the loop is done."}]},{"type":"text","bbox":{"x":317,"y":498,"w":239,"h":20},"lines":[{"wmode":0,"bbox":{"x":317,"y":498,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":506,"text":"a set of industry benchmarks. The paper ends with conclusions in"},{"wmode":0,"bbox":{"x":317,"y":508,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":516,"text":"Section 9 and an outlook on future work is presented in Section 10."}]},{"type":"text","bbox":{"x":317,"y":529,"w":173,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":529,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":540,"text":"2."},{"wmode":0,"bbox":{"x":336,"y":529,"w":154,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":336,"y":540,"text":"Overview: Example Tracing Run"}]},{"type":"text","bbox":{"x":317,"y":545,"w":239,"h":180},"lines":[{"wmode":0,"bbox":{"x":317,"y":545,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":554,"text":"This section provides an overview of our system by describing"},{"wmode":0,"bbox":{"x":317,"y":555,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":564,"text":"how TraceMonkey executes an example program. The example"},{"wmode":0,"bbox":{"x":317,"y":565,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":574,"text":"program, shown in Figure 1, computes the first 100 prime numbers"},{"wmode":0,"bbox":{"x":317,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":584,"text":"with nested loops. The narrative should be read along with Figure 2,"},{"wmode":0,"bbox":{"x":317,"y":585,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":594,"text":"which describes the activities TraceMonkey performs and when it"},{"wmode":0,"bbox":{"x":317,"y":595,"w":106,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":604,"text":"transitions between the loops."},{"wmode":0,"bbox":{"x":328,"y":605,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":613,"text":"TraceMonkey always begins executing a program in the byte-"},{"wmode":0,"bbox":{"x":317,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"code interpreter. Every loop back edge is a potential trace point."},{"wmode":0,"bbox":{"x":317,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"When the interpreter crosses a loop edge, TraceMonkey invokes"},{"wmode":0,"bbox":{"x":317,"y":635,"w":10,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"the"},{"wmode":0,"bbox":{"x":327,"y":635,"w":51,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":327,"y":643,"text":" trace monitor"},{"wmode":0,"bbox":{"x":379,"y":635,"w":176,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":379,"y":643,"text":", which may decide to record or execute a native"},{"wmode":0,"bbox":{"x":317,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":653,"text":"trace. At the start of execution, there are no compiled traces yet, so"},{"wmode":0,"bbox":{"x":317,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"the trace monitor counts the number of times each loop back edge is"},{"wmode":0,"bbox":{"x":317,"y":665,"w":107,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":673,"text":"executed until a loop becomes"},{"wmode":0,"bbox":{"x":424,"y":665,"w":13,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":424,"y":673,"text":" hot"},{"wmode":0,"bbox":{"x":437,"y":665,"w":118,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":437,"y":673,"text":", currently after 2 crossings. Note"},{"wmode":0,"bbox":{"x":317,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"that the way our loops are compiled, the loop edge is crossed before"},{"wmode":0,"bbox":{"x":317,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":693,"text":"entering the loop, so the second crossing occurs immediately after"},{"wmode":0,"bbox":{"x":317,"y":695,"w":61,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"the first iteration."},{"wmode":0,"bbox":{"x":328,"y":705,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":713,"text":"Here is the sequence of events broken down by outer loop"},{"wmode":0,"bbox":{"x":317,"y":715,"w":32,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"iteration:"}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":338,"h":127},"lines":[{"wmode":0,"bbox":{"x":54,"y":71,"w":89,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":78,"text":"v0 := ld state[748]"},{"wmode":0,"bbox":{"x":166,"y":71,"w":221,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":78,"text":"// load primes from the trace activation record"},{"wmode":0,"bbox":{"x":82,"y":81,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":82,"y":88,"text":"st sp[0], v0"},{"wmode":0,"bbox":{"x":166,"y":81,"w":169,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":88,"text":"// store primes to interpreter stack"},{"wmode":0,"bbox":{"x":54,"y":91,"w":89,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":98,"text":"v1 := ld state[764]"},{"wmode":0,"bbox":{"x":166,"y":91,"w":197,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":98,"text":"// load k from the trace activation record"},{"wmode":0,"bbox":{"x":54,"y":101,"w":61,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":108,"text":"v2 := i2f(v1)"},{"wmode":0,"bbox":{"x":166,"y":101,"w":145,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":108,"text":"// convert k from int to double"},{"wmode":0,"bbox":{"x":82,"y":111,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":82,"y":118,"text":"st sp[8], v1"},{"wmode":0,"bbox":{"x":166,"y":111,"w":145,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":118,"text":"// store k to interpreter stack"},{"wmode":0,"bbox":{"x":82,"y":121,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":82,"y":128,"text":"st sp[16], 0"},{"wmode":0,"bbox":{"x":166,"y":121,"w":164,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":128,"text":"// store false to interpreter stack"},{"wmode":0,"bbox":{"x":54,"y":131,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":138,"text":"v3 := ld v0[4]"},{"wmode":0,"bbox":{"x":166,"y":131,"w":136,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":138,"text":"// load class word for primes"},{"wmode":0,"bbox":{"x":54,"y":141,"w":75,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":147,"text":"v4 := and v3, -4"},{"wmode":0,"bbox":{"x":166,"y":141,"w":183,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":147,"text":"// mask out object class tag for primes"},{"wmode":0,"bbox":{"x":54,"y":151,"w":84,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":157,"text":"v5 := eq v4, Array"},{"wmode":0,"bbox":{"x":166,"y":151,"w":160,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":157,"text":"// test whether primes is an array"},{"wmode":0,"bbox":{"x":82,"y":161,"w":23,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":82,"y":167,"text":"xf v5"},{"wmode":0,"bbox":{"x":166,"y":161,"w":127,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":167,"text":"// side exit if v5 is false"},{"wmode":0,"bbox":{"x":54,"y":171,"w":155,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":177,"text":"v6 := js_Array_set(v0, v2, false)"},{"wmode":0,"bbox":{"x":218,"y":171,"w":174,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":218,"y":177,"text":"// call function to set array element"},{"wmode":0,"bbox":{"x":54,"y":181,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":187,"text":"v7 := eq v6, 0"},{"wmode":0,"bbox":{"x":166,"y":181,"w":141,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":187,"text":"// test return value from call"},{"wmode":0,"bbox":{"x":82,"y":191,"w":23,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":82,"y":197,"text":"xt v7"},{"wmode":0,"bbox":{"x":166,"y":191,"w":202,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":197,"text":"// side exit if js_Array_set returns false."}]},{"type":"text","bbox":{"x":54,"y":212,"w":502,"h":41},"lines":[{"wmode":0,"bbox":{"x":54,"y":212,"w":170,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":221,"text":"Figure 3. LIR snippet for sample program."},{"wmode":0,"bbox":{"x":224,"y":212,"w":332,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":224,"y":221,"text":" This is the LIR recorded for line 5 of the sample program in Figure 1. The LIR encodes"},{"wmode":0,"bbox":{"x":54,"y":222,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":231,"text":"the semantics in SSA form using temporary variables. The LIR also encodes all the stores that the interpreter would do to its data stack."},{"wmode":0,"bbox":{"x":54,"y":232,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":241,"text":"Sometimes these stores can be optimized away as the stack locations are live only on exits to the interpreter. Finally, the LIR records guards"},{"wmode":0,"bbox":{"x":54,"y":242,"w":242,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":251,"text":"and side exits to verify the assumptions made in this recording: that"},{"wmode":0,"bbox":{"x":296,"y":244,"w":30,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":296,"y":251,"text":" primes"},{"wmode":0,"bbox":{"x":326,"y":242,"w":197,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":326,"y":251,"text":" is an array and that the call to set its element succeeds."}]},{"type":"text","bbox":{"x":54,"y":271,"w":329,"h":217},"lines":[{"wmode":0,"bbox":{"x":54,"y":271,"w":80,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":277,"text":"mov edx, ebx(748)"},{"wmode":0,"bbox":{"x":162,"y":271,"w":221,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":277,"text":"// load primes from the trace activation record"},{"wmode":0,"bbox":{"x":54,"y":280,"w":70,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":287,"text":"mov edi(0), edx"},{"wmode":0,"bbox":{"x":162,"y":280,"w":188,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":287,"text":"// (*) store primes to interpreter stack"},{"wmode":0,"bbox":{"x":54,"y":290,"w":80,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":297,"text":"mov esi, ebx(764)"},{"wmode":0,"bbox":{"x":162,"y":290,"w":197,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":297,"text":"// load k from the trace activation record"},{"wmode":0,"bbox":{"x":54,"y":300,"w":70,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":307,"text":"mov edi(8), esi"},{"wmode":0,"bbox":{"x":162,"y":300,"w":164,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":307,"text":"// (*) store k to interpreter stack"},{"wmode":0,"bbox":{"x":54,"y":310,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":317,"text":"mov edi(16), 0"},{"wmode":0,"bbox":{"x":162,"y":310,"w":183,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":317,"text":"// (*) store false to interpreter stack"},{"wmode":0,"bbox":{"x":54,"y":320,"w":70,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":327,"text":"mov eax, edx(4)"},{"wmode":0,"bbox":{"x":162,"y":320,"w":188,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":327,"text":"// (*) load object class word for primes"},{"wmode":0,"bbox":{"x":54,"y":330,"w":51,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":337,"text":"and eax, -4"},{"wmode":0,"bbox":{"x":162,"y":330,"w":202,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":337,"text":"// (*) mask out object class tag for primes"},{"wmode":0,"bbox":{"x":54,"y":340,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":346,"text":"cmp eax, Array"},{"wmode":0,"bbox":{"x":162,"y":340,"w":178,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":346,"text":"// (*) test whether primes is an array"},{"wmode":0,"bbox":{"x":54,"y":350,"w":70,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":356,"text":"jne side_exit_1"},{"wmode":0,"bbox":{"x":162,"y":350,"w":197,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":356,"text":"// (*) side exit if primes is not an array"},{"wmode":0,"bbox":{"x":54,"y":360,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":366,"text":"sub esp, 8"},{"wmode":0,"bbox":{"x":162,"y":360,"w":202,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":366,"text":"// bump stack for call alignment convention"},{"wmode":0,"bbox":{"x":54,"y":370,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":376,"text":"push false"},{"wmode":0,"bbox":{"x":162,"y":370,"w":141,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":376,"text":"// push last argument for call"},{"wmode":0,"bbox":{"x":54,"y":380,"w":37,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":386,"text":"push esi"},{"wmode":0,"bbox":{"x":162,"y":380,"w":145,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":386,"text":"// push first argument for call"},{"wmode":0,"bbox":{"x":54,"y":390,"w":80,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":396,"text":"call js_Array_set"},{"wmode":0,"bbox":{"x":162,"y":390,"w":174,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":396,"text":"// call function to set array element"},{"wmode":0,"bbox":{"x":54,"y":400,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":406,"text":"add esp, 8"},{"wmode":0,"bbox":{"x":162,"y":400,"w":136,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":406,"text":"// clean up extra stack space"},{"wmode":0,"bbox":{"x":54,"y":410,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":416,"text":"mov ecx, ebx"},{"wmode":0,"bbox":{"x":162,"y":410,"w":169,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":416,"text":"// (*) created by register allocator"},{"wmode":0,"bbox":{"x":54,"y":420,"w":61,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":426,"text":"test eax, eax"},{"wmode":0,"bbox":{"x":162,"y":420,"w":188,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":426,"text":"// (*) test return value of js_Array_set"},{"wmode":0,"bbox":{"x":54,"y":430,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":436,"text":"je side_exit_2"},{"wmode":0,"bbox":{"x":162,"y":430,"w":145,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":436,"text":"// (*) side exit if call failed"},{"wmode":0,"bbox":{"x":54,"y":440,"w":14,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":446,"text":"..."},{"wmode":0,"bbox":{"x":54,"y":450,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":456,"text":"side_exit_1:"},{"wmode":0,"bbox":{"x":54,"y":460,"w":75,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":466,"text":"mov ecx, ebp(-4)"},{"wmode":0,"bbox":{"x":162,"y":460,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":466,"text":"// restore ecx"},{"wmode":0,"bbox":{"x":54,"y":470,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":476,"text":"mov esp, ebp"},{"wmode":0,"bbox":{"x":162,"y":470,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":476,"text":"// restore esp"},{"wmode":0,"bbox":{"x":54,"y":480,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":486,"text":"jmp epilog"},{"wmode":0,"bbox":{"x":162,"y":480,"w":112,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":162,"y":486,"text":"// jump to ret statement"}]},{"type":"text","bbox":{"x":54,"y":501,"w":502,"h":41},"lines":[{"wmode":0,"bbox":{"x":54,"y":501,"w":161,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":509,"text":"Figure 4. x86 snippet for sample program."},{"wmode":0,"bbox":{"x":215,"y":501,"w":340,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":215,"y":509,"text":" This is the x86 code compiled from the LIR snippet in Figure 3. Most LIR instructions compile"},{"wmode":0,"bbox":{"x":54,"y":511,"w":190,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":519,"text":"to a single x86 instruction. Instructions marked with"},{"wmode":0,"bbox":{"x":244,"y":513,"w":16,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":244,"y":519,"text":" (*)"},{"wmode":0,"bbox":{"x":261,"y":511,"w":294,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":261,"y":519,"text":" would be omitted by an idealized compiler that knew that none of the side exits"},{"wmode":0,"bbox":{"x":54,"y":521,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":529,"text":"would ever be taken. The 17 instructions generated by the compiler compare favorably with the 100+ instructions that the interpreter would"},{"wmode":0,"bbox":{"x":54,"y":531,"w":222,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":539,"text":"execute for the same code snippet, including 4 indirect jumps."}]},{"type":"text","bbox":{"x":54,"y":561,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":65,"y":561,"w":14,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":569,"text":"i=2."},{"wmode":0,"bbox":{"x":80,"y":561,"w":212,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":80,"y":569,"text":" This is the first iteration of the outer loop. The loop on"},{"wmode":0,"bbox":{"x":54,"y":571,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":579,"text":"lines 4-5 becomes hot on its second iteration, so TraceMonkey en-"},{"wmode":0,"bbox":{"x":54,"y":581,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":589,"text":"ters recording mode on line 4. In recording mode, TraceMonkey"},{"wmode":0,"bbox":{"x":54,"y":591,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":599,"text":"records the code along the trace in a low-level compiler intermedi-"},{"wmode":0,"bbox":{"x":54,"y":601,"w":91,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":609,"text":"ate representation we call"},{"wmode":0,"bbox":{"x":145,"y":601,"w":15,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":145,"y":609,"text":" LIR"},{"wmode":0,"bbox":{"x":161,"y":601,"w":131,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":161,"y":609,"text":". The LIR trace encodes all the oper-"},{"wmode":0,"bbox":{"x":54,"y":611,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":619,"text":"ations performed and the types of all operands. The LIR trace also"},{"wmode":0,"bbox":{"x":54,"y":621,"w":28,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":629,"text":"encodes"},{"wmode":0,"bbox":{"x":82,"y":621,"w":27,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":82,"y":629,"text":" guards"},{"wmode":0,"bbox":{"x":110,"y":621,"w":183,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":110,"y":629,"text":", which are checks that verify that the control flow"},{"wmode":0,"bbox":{"x":54,"y":631,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":639,"text":"and types are identical to those observed during trace recording."},{"wmode":0,"bbox":{"x":54,"y":641,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":649,"text":"Thus, on later executions, if and only if all guards are passed, the"},{"wmode":0,"bbox":{"x":54,"y":651,"w":149,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":659,"text":"trace has the required program semantics."},{"wmode":0,"bbox":{"x":65,"y":660,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":669,"text":"TraceMonkey stops recording when execution returns to the"},{"wmode":0,"bbox":{"x":54,"y":670,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":679,"text":"loop header or exits the loop. In this case, execution returns to the"},{"wmode":0,"bbox":{"x":54,"y":680,"w":77,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":689,"text":"loop header on line 4."},{"wmode":0,"bbox":{"x":65,"y":690,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":699,"text":"After recording is finished, TraceMonkey compiles the trace to"},{"wmode":0,"bbox":{"x":54,"y":700,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":709,"text":"native code using the recorded type information for optimization."},{"wmode":0,"bbox":{"x":54,"y":710,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":719,"text":"The result is a native code fragment that can be entered if the"}]},{"type":"text","bbox":{"x":317,"y":561,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":317,"y":561,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":569,"text":"interpreter PC and the types of values match those observed when"},{"wmode":0,"bbox":{"x":317,"y":571,"w":220,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":579,"text":"trace recording was started. The first trace in our example,"},{"wmode":0,"bbox":{"x":537,"y":572,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":537,"y":579,"text":" T"},{"wmode":0,"bbox":{"x":546,"y":576,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":546,"y":580,"text":"45"},{"wmode":0,"bbox":{"x":553,"y":571,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":553,"y":579,"text":","},{"wmode":0,"bbox":{"x":317,"y":581,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":589,"text":"covers lines 4 and 5. This trace can be entered if the PC is at line 4,"},{"wmode":0,"bbox":{"x":317,"y":593,"w":4,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":599,"text":"i"},{"wmode":0,"bbox":{"x":321,"y":591,"w":15,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":321,"y":599,"text":" and"},{"wmode":0,"bbox":{"x":336,"y":593,"w":6,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":336,"y":599,"text":" k"},{"wmode":0,"bbox":{"x":343,"y":591,"w":60,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":343,"y":599,"text":" are integers, and"},{"wmode":0,"bbox":{"x":404,"y":593,"w":30,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":404,"y":599,"text":" primes"},{"wmode":0,"bbox":{"x":434,"y":591,"w":104,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":434,"y":599,"text":" is an object. After compiling"},{"wmode":0,"bbox":{"x":538,"y":592,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":538,"y":599,"text":" T"},{"wmode":0,"bbox":{"x":546,"y":596,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":546,"y":600,"text":"45"},{"wmode":0,"bbox":{"x":553,"y":591,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":553,"y":599,"text":","},{"wmode":0,"bbox":{"x":317,"y":601,"w":228,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":609,"text":"TraceMonkey returns to the interpreter and loops back to line 1."},{"wmode":0,"bbox":{"x":328,"y":610,"w":14,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":619,"text":"i=3."},{"wmode":0,"bbox":{"x":343,"y":611,"w":212,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":343,"y":619,"text":" Now the loop header at line 1 has become hot, so Trace-"},{"wmode":0,"bbox":{"x":317,"y":621,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":629,"text":"Monkey starts recording. When recording reaches line 4, Trace-"},{"wmode":0,"bbox":{"x":317,"y":631,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":639,"text":"Monkey observes that it has reached an inner loop header that al-"},{"wmode":0,"bbox":{"x":317,"y":641,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":649,"text":"ready has a compiled trace, so TraceMonkey attempts to nest the"},{"wmode":0,"bbox":{"x":317,"y":651,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":659,"text":"inner loop inside the current trace. The first step is to call the inner"},{"wmode":0,"bbox":{"x":317,"y":660,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":669,"text":"trace as a subroutine. This executes the loop on line 4 to completion"},{"wmode":0,"bbox":{"x":317,"y":670,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":679,"text":"and then returns to the recorder. TraceMonkey verifies that the call"},{"wmode":0,"bbox":{"x":317,"y":680,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":689,"text":"was successful and then records the call to the inner trace as part of"},{"wmode":0,"bbox":{"x":317,"y":690,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":699,"text":"the current trace. Recording continues until execution reaches line"},{"wmode":0,"bbox":{"x":317,"y":700,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":709,"text":"1, and at which point TraceMonkey finishes and compiles a trace"},{"wmode":0,"bbox":{"x":317,"y":710,"w":64,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":719,"text":"for the outer loop,"},{"wmode":0,"bbox":{"x":381,"y":712,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":381,"y":719,"text":" T"},{"wmode":0,"bbox":{"x":389,"y":715,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":389,"y":720,"text":"16"},{"wmode":0,"bbox":{"x":397,"y":710,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":397,"y":719,"text":"."}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":65,"y":71,"w":14,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":79,"text":"i=4."},{"wmode":0,"bbox":{"x":80,"y":71,"w":132,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":80,"y":79,"text":" On this iteration, TraceMonkey calls"},{"wmode":0,"bbox":{"x":212,"y":73,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":212,"y":79,"text":" T"},{"wmode":0,"bbox":{"x":219,"y":76,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":219,"y":80,"text":"16"},{"wmode":0,"bbox":{"x":227,"y":71,"w":34,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":227,"y":79,"text":". Because"},{"wmode":0,"bbox":{"x":261,"y":73,"w":16,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":261,"y":79,"text":" i=4"},{"wmode":0,"bbox":{"x":277,"y":71,"w":15,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":277,"y":79,"text":", the"},{"wmode":0,"bbox":{"x":54,"y":83,"w":9,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":89,"text":"if"},{"wmode":0,"bbox":{"x":63,"y":81,"w":229,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":89,"text":" statement on line 2 is taken. This branch was not taken in the"},{"wmode":0,"bbox":{"x":54,"y":91,"w":100,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":99,"text":"original trace, so this causes"},{"wmode":0,"bbox":{"x":154,"y":93,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":154,"y":99,"text":" T"},{"wmode":0,"bbox":{"x":161,"y":96,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":161,"y":100,"text":"16"},{"wmode":0,"bbox":{"x":168,"y":91,"w":124,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":168,"y":100,"text":" to fail a guard and take a side exit."},{"wmode":0,"bbox":{"x":54,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":109,"text":"The exit is not yet hot, so TraceMonkey returns to the interpreter,"},{"wmode":0,"bbox":{"x":54,"y":111,"w":139,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":119,"text":"which executes the continue statement."},{"wmode":0,"bbox":{"x":65,"y":121,"w":14,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":129,"text":"i=5."},{"wmode":0,"bbox":{"x":80,"y":121,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":80,"y":129,"text":" TraceMonkey calls"},{"wmode":0,"bbox":{"x":150,"y":123,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":150,"y":129,"text":" T"},{"wmode":0,"bbox":{"x":157,"y":126,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":157,"y":130,"text":"16"},{"wmode":0,"bbox":{"x":165,"y":121,"w":127,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":165,"y":129,"text":", which in turn calls the nested trace"},{"wmode":0,"bbox":{"x":54,"y":133,"w":5,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":54,"y":139,"text":"T"},{"wmode":0,"bbox":{"x":59,"y":136,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":59,"y":140,"text":"45"},{"wmode":0,"bbox":{"x":67,"y":131,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":67,"y":139,"text":"."},{"wmode":0,"bbox":{"x":69,"y":133,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":69,"y":139,"text":" T"},{"wmode":0,"bbox":{"x":77,"y":136,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":77,"y":140,"text":"16"},{"wmode":0,"bbox":{"x":85,"y":131,"w":207,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":85,"y":140,"text":" loops back to its own header, starting the next iteration"},{"wmode":0,"bbox":{"x":54,"y":141,"w":134,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":149,"text":"without ever returning to the monitor."},{"wmode":0,"bbox":{"x":65,"y":151,"w":14,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":159,"text":"i=6."},{"wmode":0,"bbox":{"x":80,"y":151,"w":212,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":80,"y":159,"text":" On this iteration, the side exit on line 2 is taken again. This"},{"wmode":0,"bbox":{"x":54,"y":161,"w":156,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":169,"text":"time, the side exit becomes hot, so a trace"},{"wmode":0,"bbox":{"x":210,"y":162,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":210,"y":169,"text":" T"},{"wmode":0,"bbox":{"x":219,"y":166,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":219,"y":170,"text":"23"},{"wmode":0,"bbox":{"x":226,"y":166,"w":2,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":226,"y":170,"text":","},{"wmode":0,"bbox":{"x":228,"y":166,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":228,"y":170,"text":"1"},{"wmode":0,"bbox":{"x":232,"y":161,"w":60,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":232,"y":170,"text":" is recorded that"},{"wmode":0,"bbox":{"x":54,"y":171,"w":217,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":179,"text":"covers line 3 and returns to the loop header. Thus, the end of"},{"wmode":0,"bbox":{"x":271,"y":172,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":271,"y":179,"text":" T"},{"wmode":0,"bbox":{"x":279,"y":176,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":279,"y":180,"text":"23"},{"wmode":0,"bbox":{"x":286,"y":176,"w":2,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":286,"y":180,"text":","},{"wmode":0,"bbox":{"x":288,"y":176,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":288,"y":180,"text":"1"},{"wmode":0,"bbox":{"x":54,"y":181,"w":104,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":189,"text":"jumps directly to the start of"},{"wmode":0,"bbox":{"x":158,"y":182,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":158,"y":189,"text":" T"},{"wmode":0,"bbox":{"x":166,"y":186,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":166,"y":190,"text":"16"},{"wmode":0,"bbox":{"x":174,"y":181,"w":118,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":174,"y":189,"text":". The side exit is patched so that"},{"wmode":0,"bbox":{"x":54,"y":191,"w":140,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":199,"text":"on future iterations, it jumps directly to"},{"wmode":0,"bbox":{"x":194,"y":192,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":194,"y":199,"text":" T"},{"wmode":0,"bbox":{"x":202,"y":196,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":202,"y":200,"text":"23"},{"wmode":0,"bbox":{"x":209,"y":196,"w":2,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":209,"y":200,"text":","},{"wmode":0,"bbox":{"x":211,"y":196,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":211,"y":200,"text":"1"},{"wmode":0,"bbox":{"x":216,"y":191,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":199,"text":"."},{"wmode":0,"bbox":{"x":65,"y":201,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":209,"text":"At this point, TraceMonkey has compiled enough traces to cover"},{"wmode":0,"bbox":{"x":54,"y":211,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":219,"text":"the entire nested loop structure, so the rest of the program runs"},{"wmode":0,"bbox":{"x":54,"y":221,"w":82,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":229,"text":"entirely as native code."}]},{"type":"text","bbox":{"x":54,"y":245,"w":73,"h":14},"lines":[{"wmode":0,"bbox":{"x":54,"y":245,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":54,"y":256,"text":"3."},{"wmode":0,"bbox":{"x":73,"y":245,"w":54,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":73,"y":256,"text":"Trace Trees"}]},{"type":"text","bbox":{"x":54,"y":262,"w":239,"h":40},"lines":[{"wmode":0,"bbox":{"x":54,"y":262,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":270,"text":"In this section, we describe traces, trace trees, and how they are"},{"wmode":0,"bbox":{"x":54,"y":272,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":280,"text":"formed at run time. Although our techniques apply to any dynamic"},{"wmode":0,"bbox":{"x":54,"y":282,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":290,"text":"language interpreter, we will describe them assuming a bytecode"},{"wmode":0,"bbox":{"x":54,"y":292,"w":146,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":300,"text":"interpreter to keep the exposition simple."}]},{"type":"text","bbox":{"x":54,"y":312,"w":45,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":312,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":321,"text":"3.1"},{"wmode":0,"bbox":{"x":74,"y":312,"w":25,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":321,"text":"Traces"}]},{"type":"text","bbox":{"x":54,"y":326,"w":239,"h":399},"lines":[{"wmode":0,"bbox":{"x":54,"y":326,"w":6,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":335,"text":"A"},{"wmode":0,"bbox":{"x":60,"y":326,"w":21,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":60,"y":335,"text":" trace"},{"wmode":0,"bbox":{"x":81,"y":326,"w":211,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":81,"y":335,"text":" is simply a program path, which may cross function call"},{"wmode":0,"bbox":{"x":54,"y":336,"w":134,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":344,"text":"boundaries. TraceMonkey focuses on"},{"wmode":0,"bbox":{"x":188,"y":336,"w":42,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":188,"y":344,"text":" loop traces"},{"wmode":0,"bbox":{"x":231,"y":336,"w":61,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":231,"y":344,"text":", that originate at"},{"wmode":0,"bbox":{"x":54,"y":346,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":354,"text":"a loop edge and represent a single iteration through the associated"},{"wmode":0,"bbox":{"x":54,"y":356,"w":18,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":364,"text":"loop."},{"wmode":0,"bbox":{"x":65,"y":366,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":374,"text":"Similar to an extended basic block, a trace is only entered at"},{"wmode":0,"bbox":{"x":54,"y":376,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":384,"text":"the top, but may have many exits. In contrast to an extended basic"},{"wmode":0,"bbox":{"x":54,"y":386,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":394,"text":"block, a trace can contain join nodes. Since a trace always only"},{"wmode":0,"bbox":{"x":54,"y":396,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":404,"text":"follows one single path through the original program, however, join"},{"wmode":0,"bbox":{"x":54,"y":406,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":414,"text":"nodes are not recognizable as such in a trace and have a single"},{"wmode":0,"bbox":{"x":54,"y":416,"w":130,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":424,"text":"predecessor node like regular nodes."},{"wmode":0,"bbox":{"x":65,"y":426,"w":6,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":434,"text":"A"},{"wmode":0,"bbox":{"x":72,"y":426,"w":42,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":72,"y":434,"text":" typed trace"},{"wmode":0,"bbox":{"x":114,"y":426,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":114,"y":434,"text":" is a trace annotated with a type for every variable"},{"wmode":0,"bbox":{"x":54,"y":436,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":444,"text":"(including temporaries) on the trace. A typed trace also has an entry"},{"wmode":0,"bbox":{"x":54,"y":446,"w":33,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":54,"y":454,"text":"type map"},{"wmode":0,"bbox":{"x":87,"y":446,"w":206,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":87,"y":454,"text":" giving the required types for variables used on the trace"},{"wmode":0,"bbox":{"x":54,"y":456,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":464,"text":"before they are defined. For example, a trace could have a type map"},{"wmode":0,"bbox":{"x":54,"y":468,"w":94,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":54,"y":474,"text":"(x: int, b: boolean)"},{"wmode":0,"bbox":{"x":148,"y":466,"w":144,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":148,"y":474,"text":", meaning that the trace may be entered"},{"wmode":0,"bbox":{"x":54,"y":476,"w":112,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":484,"text":"only if the value of the variable"},{"wmode":0,"bbox":{"x":166,"y":478,"w":7,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":166,"y":484,"text":" x"},{"wmode":0,"bbox":{"x":173,"y":476,"w":35,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":173,"y":484,"text":" is of type"},{"wmode":0,"bbox":{"x":209,"y":478,"w":16,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":209,"y":484,"text":" int"},{"wmode":0,"bbox":{"x":226,"y":476,"w":59,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":226,"y":484,"text":" and the value of"},{"wmode":0,"bbox":{"x":286,"y":478,"w":7,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":286,"y":484,"text":" b"},{"wmode":0,"bbox":{"x":54,"y":486,"w":33,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":494,"text":"is of type"},{"wmode":0,"bbox":{"x":87,"y":488,"w":35,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":87,"y":494,"text":" boolean"},{"wmode":0,"bbox":{"x":123,"y":486,"w":170,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":123,"y":494,"text":". The entry type map is much like the signature"},{"wmode":0,"bbox":{"x":54,"y":496,"w":48,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":504,"text":"of a function."},{"wmode":0,"bbox":{"x":65,"y":506,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":514,"text":"In this paper, we only discuss typed loop traces, and we will"},{"wmode":0,"bbox":{"x":54,"y":516,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":524,"text":"refer to them simply as “traces”. The key property of typed loop"},{"wmode":0,"bbox":{"x":54,"y":525,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":534,"text":"traces is that they can be compiled to efficient machine code using"},{"wmode":0,"bbox":{"x":54,"y":535,"w":166,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":544,"text":"the same techniques used for typed languages."},{"wmode":0,"bbox":{"x":65,"y":545,"w":211,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":554,"text":"In TraceMonkey, traces are recorded in trace-flavored SSA"},{"wmode":0,"bbox":{"x":277,"y":545,"w":15,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":277,"y":554,"text":" LIR"},{"wmode":0,"bbox":{"x":54,"y":555,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":564,"text":"(low-level intermediate representation). In trace-flavored SSA (or"},{"wmode":0,"bbox":{"x":54,"y":565,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":574,"text":"TSSA), phi nodes appear only at the entry point, which is reached"},{"wmode":0,"bbox":{"x":54,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":584,"text":"both on entry and via loop edges. The important LIR primitives"},{"wmode":0,"bbox":{"x":54,"y":585,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":594,"text":"are constant values, memory loads and stores (by address and"},{"wmode":0,"bbox":{"x":54,"y":595,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":604,"text":"offset), integer operators, floating-point operators, function calls,"},{"wmode":0,"bbox":{"x":54,"y":605,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":613,"text":"and conditional exits. Type conversions, such as integer to double,"},{"wmode":0,"bbox":{"x":54,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":623,"text":"are represented by function calls. This makes the LIR used by"},{"wmode":0,"bbox":{"x":54,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":633,"text":"TraceMonkey independent of the concrete type system and type"},{"wmode":0,"bbox":{"x":54,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":643,"text":"conversion rules of the source language. The LIR operations are"},{"wmode":0,"bbox":{"x":54,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":653,"text":"generic enough that the backend compiler is language independent."},{"wmode":0,"bbox":{"x":54,"y":655,"w":136,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":663,"text":"Figure 3 shows an example LIR trace."},{"wmode":0,"bbox":{"x":65,"y":665,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":673,"text":"Bytecode interpreters typically represent values in a various"},{"wmode":0,"bbox":{"x":54,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":683,"text":"complex data structures (e.g., hash tables) in a boxed format (i.e.,"},{"wmode":0,"bbox":{"x":54,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":693,"text":"with attached type tag bits). Since a trace is intended to represent"},{"wmode":0,"bbox":{"x":54,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":703,"text":"efficient code that eliminates all that complexity, our traces oper-"},{"wmode":0,"bbox":{"x":54,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":713,"text":"ate on unboxed values in simple variables and arrays as much as"},{"wmode":0,"bbox":{"x":54,"y":715,"w":31,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":723,"text":"possible."}]},{"type":"text","bbox":{"x":317,"y":71,"w":239,"h":638},"lines":[{"wmode":0,"bbox":{"x":328,"y":71,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":79,"text":"A trace records all its intermediate values in a small activation"},{"wmode":0,"bbox":{"x":317,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":89,"text":"record area. To make variable accesses fast on trace, the trace also"},{"wmode":0,"bbox":{"x":317,"y":91,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":99,"text":"imports local and global variables by unboxing them and copying"},{"wmode":0,"bbox":{"x":317,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":109,"text":"them to its activation record. Thus, the trace can read and write"},{"wmode":0,"bbox":{"x":317,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":119,"text":"these variables with simple loads and stores from a native activation"},{"wmode":0,"bbox":{"x":317,"y":121,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":129,"text":"recording, independently of the boxing mechanism used by the"},{"wmode":0,"bbox":{"x":317,"y":131,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":139,"text":"interpreter. When the trace exits, the VM boxes the values from"},{"wmode":0,"bbox":{"x":317,"y":141,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":149,"text":"this native storage location and copies them back to the interpreter"},{"wmode":0,"bbox":{"x":317,"y":151,"w":37,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":159,"text":"structures."},{"wmode":0,"bbox":{"x":328,"y":161,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":169,"text":"For every control-flow branch in the source program, the"},{"wmode":0,"bbox":{"x":317,"y":171,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":179,"text":"recorder generates conditional exit LIR instructions. These instruc-"},{"wmode":0,"bbox":{"x":317,"y":181,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":189,"text":"tions exit from the trace if required control flow is different from"},{"wmode":0,"bbox":{"x":317,"y":191,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":199,"text":"what it was at trace recording, ensuring that the trace instructions"},{"wmode":0,"bbox":{"x":317,"y":201,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":209,"text":"are run only if they are supposed to. We call these instructions"},{"wmode":0,"bbox":{"x":317,"y":211,"w":21,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":317,"y":219,"text":"guard"},{"wmode":0,"bbox":{"x":338,"y":211,"w":46,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":338,"y":219,"text":" instructions."},{"wmode":0,"bbox":{"x":328,"y":221,"w":206,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":229,"text":"Most of our traces represent loops and end with the special"},{"wmode":0,"bbox":{"x":535,"y":223,"w":20,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":535,"y":229,"text":" loop"},{"wmode":0,"bbox":{"x":317,"y":231,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":239,"text":"LIR instruction. This is just an unconditional branch to the top of"},{"wmode":0,"bbox":{"x":317,"y":241,"w":159,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":249,"text":"the trace. Such traces return only via guards."},{"wmode":0,"bbox":{"x":328,"y":251,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":259,"text":"Now, we describe the key optimizations that are performed as"},{"wmode":0,"bbox":{"x":317,"y":260,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":269,"text":"part of recording LIR. All of these optimizations reduce complex"},{"wmode":0,"bbox":{"x":317,"y":270,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":279,"text":"dynamic language constructs to simple typed constructs by spe-"},{"wmode":0,"bbox":{"x":317,"y":280,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":289,"text":"cializing for the current trace. Each optimization requires guard in-"},{"wmode":0,"bbox":{"x":317,"y":290,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":299,"text":"structions to verify their assumptions about the state and exit the"},{"wmode":0,"bbox":{"x":317,"y":300,"w":63,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":309,"text":"trace if necessary."},{"wmode":0,"bbox":{"x":328,"y":310,"w":75,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":319,"text":"Type specialization."},{"wmode":0,"bbox":{"x":328,"y":320,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":329,"text":"All LIR primitives apply to operands of specific types. Thus,"},{"wmode":0,"bbox":{"x":317,"y":330,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":338,"text":"LIR traces are necessarily type-specialized, and a compiler can"},{"wmode":0,"bbox":{"x":317,"y":340,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":348,"text":"easily produce a translation that requires no type dispatches. A"},{"wmode":0,"bbox":{"x":317,"y":350,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":358,"text":"typical bytecode interpreter carries tag bits along with each value,"},{"wmode":0,"bbox":{"x":317,"y":360,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":368,"text":"and to perform any operation, must check the tag bits, dynamically"},{"wmode":0,"bbox":{"x":317,"y":370,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":378,"text":"dispatch, mask out the tag bits to recover the untagged value,"},{"wmode":0,"bbox":{"x":317,"y":380,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":388,"text":"perform the operation, and then reapply tags. LIR omits everything"},{"wmode":0,"bbox":{"x":317,"y":390,"w":94,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":398,"text":"except the operation itself."},{"wmode":0,"bbox":{"x":328,"y":400,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":408,"text":"A potential problem is that some operations can produce values"},{"wmode":0,"bbox":{"x":317,"y":410,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":418,"text":"of unpredictable types. For example, reading a property from an"},{"wmode":0,"bbox":{"x":317,"y":420,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":428,"text":"object could yield a value of any type, not necessarily the type"},{"wmode":0,"bbox":{"x":317,"y":430,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":438,"text":"observed during recording. The recorder emits guard instructions"},{"wmode":0,"bbox":{"x":317,"y":440,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":448,"text":"that conditionally exit if the operation yields a value of a different"},{"wmode":0,"bbox":{"x":317,"y":450,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":458,"text":"type from that seen during recording. These guard instructions"},{"wmode":0,"bbox":{"x":317,"y":460,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":468,"text":"guarantee that as long as execution is on trace, the types of values"},{"wmode":0,"bbox":{"x":317,"y":470,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":478,"text":"match those of the typed trace. When the VM observes a side exit"},{"wmode":0,"bbox":{"x":317,"y":480,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":488,"text":"along such a type guard, a new typed trace is recorded originating"},{"wmode":0,"bbox":{"x":317,"y":490,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":498,"text":"at the side exit location, capturing the new type of the operation in"},{"wmode":0,"bbox":{"x":317,"y":500,"w":32,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":508,"text":"question."},{"wmode":0,"bbox":{"x":328,"y":509,"w":149,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":518,"text":"Representation specialization: objects."},{"wmode":0,"bbox":{"x":478,"y":510,"w":77,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":478,"y":518,"text":" In JavaScript, name"},{"wmode":0,"bbox":{"x":317,"y":520,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":528,"text":"lookup semantics are complex and potentially expensive because"},{"wmode":0,"bbox":{"x":317,"y":529,"w":172,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":538,"text":"they include features like object inheritance and"},{"wmode":0,"bbox":{"x":489,"y":531,"w":21,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":489,"y":538,"text":" eval"},{"wmode":0,"bbox":{"x":510,"y":529,"w":45,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":510,"y":538,"text":". To evaluate"},{"wmode":0,"bbox":{"x":317,"y":539,"w":144,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":548,"text":"an object property read expression like"},{"wmode":0,"bbox":{"x":461,"y":541,"w":17,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":461,"y":548,"text":" o.x"},{"wmode":0,"bbox":{"x":478,"y":539,"w":77,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":478,"y":548,"text":", the interpreter must"},{"wmode":0,"bbox":{"x":317,"y":549,"w":97,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":558,"text":"search the property map of"},{"wmode":0,"bbox":{"x":414,"y":551,"w":7,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":414,"y":558,"text":" o"},{"wmode":0,"bbox":{"x":421,"y":549,"w":134,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":421,"y":558,"text":" and all of its prototypes and parents."},{"wmode":0,"bbox":{"x":317,"y":559,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":568,"text":"Property maps can be implemented with different data structures"},{"wmode":0,"bbox":{"x":317,"y":569,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":578,"text":"(e.g., per-object hash tables or shared hash tables), so the search"},{"wmode":0,"bbox":{"x":317,"y":579,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":588,"text":"process also must dispatch on the representation of each object"},{"wmode":0,"bbox":{"x":317,"y":589,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":598,"text":"found during search. TraceMonkey can simply observe the result of"},{"wmode":0,"bbox":{"x":317,"y":599,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":607,"text":"the search process and record the simplest possible LIR to access"},{"wmode":0,"bbox":{"x":317,"y":609,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":617,"text":"the property value. For example, the search might finds the value of"},{"wmode":0,"bbox":{"x":317,"y":621,"w":14,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":627,"text":"o.x"},{"wmode":0,"bbox":{"x":331,"y":619,"w":68,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":331,"y":627,"text":" in the prototype of"},{"wmode":0,"bbox":{"x":399,"y":621,"w":6,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":399,"y":627,"text":" o"},{"wmode":0,"bbox":{"x":406,"y":619,"w":149,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":406,"y":627,"text":", which uses a shared hash-table represen-"},{"wmode":0,"bbox":{"x":317,"y":629,"w":60,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":637,"text":"tation that places"},{"wmode":0,"bbox":{"x":377,"y":631,"w":6,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":377,"y":637,"text":" x"},{"wmode":0,"bbox":{"x":384,"y":629,"w":171,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":384,"y":637,"text":" in slot 2 of a property vector. Then the recorded"},{"wmode":0,"bbox":{"x":317,"y":639,"w":97,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":647,"text":"can generate LIR that reads"},{"wmode":0,"bbox":{"x":414,"y":641,"w":16,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":414,"y":647,"text":" o.x"},{"wmode":0,"bbox":{"x":430,"y":639,"w":125,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":430,"y":647,"text":" with just two or three loads: one to"},{"wmode":0,"bbox":{"x":317,"y":649,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":657,"text":"get the prototype, possibly one to get the property value vector, and"},{"wmode":0,"bbox":{"x":317,"y":659,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":667,"text":"one more to get slot 2 from the vector. This is a vast simplification"},{"wmode":0,"bbox":{"x":317,"y":669,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":677,"text":"and speedup compared to the original interpreter code. Inheritance"},{"wmode":0,"bbox":{"x":317,"y":679,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":687,"text":"relationships and object representations can change during execu-"},{"wmode":0,"bbox":{"x":317,"y":689,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":697,"text":"tion, so the simplified code requires guard instructions that ensure"},{"wmode":0,"bbox":{"x":317,"y":699,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":707,"text":"the object representation is the same. In TraceMonkey, objects’ rep-"}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":239,"h":469},"lines":[{"wmode":0,"bbox":{"x":54,"y":71,"w":187,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":79,"text":"resentations are assigned an integer key called the"},{"wmode":0,"bbox":{"x":241,"y":71,"w":49,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":241,"y":79,"text":" object shape"},{"wmode":0,"bbox":{"x":290,"y":71,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":290,"y":79,"text":"."},{"wmode":0,"bbox":{"x":54,"y":81,"w":224,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":89,"text":"Thus, the guard is a simple equality check on the object shape."},{"wmode":0,"bbox":{"x":65,"y":91,"w":157,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":99,"text":"Representation specialization: numbers."},{"wmode":0,"bbox":{"x":223,"y":91,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":223,"y":99,"text":" JavaScript has no"},{"wmode":0,"bbox":{"x":54,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":109,"text":"integer type, only a Number type that is the set of 64-bit IEEE-"},{"wmode":0,"bbox":{"x":54,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":119,"text":"754 floating-pointer numbers (“doubles”). But many JavaScript"},{"wmode":0,"bbox":{"x":54,"y":121,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":129,"text":"operators, in particular array accesses and bitwise operators, really"},{"wmode":0,"bbox":{"x":54,"y":131,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":139,"text":"operate on integers, so they first convert the number to an integer,"},{"wmode":0,"bbox":{"x":54,"y":141,"w":196,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":150,"text":"and then convert any integer result back to a double."},{"wmode":0,"bbox":{"x":250,"y":140,"w":2,"h":7},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":5},"x":250,"y":146,"text":"1"},{"wmode":0,"bbox":{"x":253,"y":137,"w":39,"h":14},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":253,"y":146,"text":" Clearly, a"},{"wmode":0,"bbox":{"x":54,"y":151,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":160,"text":"JavaScript VM that wants to be fast must find a way to operate on"},{"wmode":0,"bbox":{"x":54,"y":161,"w":162,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":169,"text":"integers directly and avoid these conversions."},{"wmode":0,"bbox":{"x":65,"y":171,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":179,"text":"In TraceMonkey, we support two representations for numbers:"},{"wmode":0,"bbox":{"x":54,"y":181,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":189,"text":"integers and doubles. The interpreter uses integer representations"},{"wmode":0,"bbox":{"x":54,"y":191,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":199,"text":"as much as it can, switching for results that can only be represented"},{"wmode":0,"bbox":{"x":54,"y":201,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":209,"text":"as doubles. When a trace is started, some values may be imported"},{"wmode":0,"bbox":{"x":54,"y":211,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":219,"text":"and represented as integers. Some operations on integers require"},{"wmode":0,"bbox":{"x":54,"y":221,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":229,"text":"guards. For example, adding two integers can produce a value too"},{"wmode":0,"bbox":{"x":54,"y":231,"w":125,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":239,"text":"large for the integer representation."},{"wmode":0,"bbox":{"x":65,"y":241,"w":69,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":249,"text":"Function inlining."},{"wmode":0,"bbox":{"x":135,"y":241,"w":157,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":135,"y":249,"text":" LIR traces can cross function boundaries"},{"wmode":0,"bbox":{"x":54,"y":251,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":259,"text":"in either direction, achieving function inlining. Move instructions"},{"wmode":0,"bbox":{"x":54,"y":261,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":269,"text":"need to be recorded for function entry and exit to copy arguments"},{"wmode":0,"bbox":{"x":54,"y":271,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":279,"text":"in and return values out. These move statements are then optimized"},{"wmode":0,"bbox":{"x":54,"y":281,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":289,"text":"away by the compiler using copy propagation. In order to be able"},{"wmode":0,"bbox":{"x":54,"y":291,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":299,"text":"to return to the interpreter, the trace must also generate LIR to"},{"wmode":0,"bbox":{"x":54,"y":301,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":309,"text":"record that a call frame has been entered and exited. The frame"},{"wmode":0,"bbox":{"x":54,"y":311,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":319,"text":"entry and exit LIR saves just enough information to allow the"},{"wmode":0,"bbox":{"x":54,"y":321,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":329,"text":"intepreter call stack to be restored later and is much simpler than"},{"wmode":0,"bbox":{"x":54,"y":331,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":339,"text":"the interpreter’s standard call code. If the function being entered"},{"wmode":0,"bbox":{"x":54,"y":341,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":349,"text":"is not constant (which in JavaScript includes any call by function"},{"wmode":0,"bbox":{"x":54,"y":351,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":359,"text":"name), the recorder must also emit LIR to guard that the function"},{"wmode":0,"bbox":{"x":54,"y":360,"w":42,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":369,"text":"is the same."},{"wmode":0,"bbox":{"x":65,"y":370,"w":91,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":379,"text":"Guards and side exits."},{"wmode":0,"bbox":{"x":156,"y":370,"w":136,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":156,"y":379,"text":" Each optimization described above"},{"wmode":0,"bbox":{"x":54,"y":380,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":389,"text":"requires one or more guards to verify the assumptions made in"},{"wmode":0,"bbox":{"x":54,"y":390,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":399,"text":"doing the optimization. A guard is just a group of LIR instructions"},{"wmode":0,"bbox":{"x":54,"y":400,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":409,"text":"that performs a test and conditional exit. The exit branches to a"},{"wmode":0,"bbox":{"x":54,"y":410,"w":30,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":54,"y":419,"text":"side exit"},{"wmode":0,"bbox":{"x":84,"y":410,"w":208,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":84,"y":419,"text":", a small off-trace piece of LIR that returns a pointer to"},{"wmode":0,"bbox":{"x":54,"y":420,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":429,"text":"a structure that describes the reason for the exit along with the"},{"wmode":0,"bbox":{"x":54,"y":430,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":438,"text":"interpreter PC at the exit point and any other data needed to restore"},{"wmode":0,"bbox":{"x":54,"y":440,"w":114,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":448,"text":"the interpreter’s state structures."},{"wmode":0,"bbox":{"x":65,"y":450,"w":28,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":458,"text":"Aborts."},{"wmode":0,"bbox":{"x":94,"y":450,"w":198,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":94,"y":458,"text":" Some constructs are difficult to record in LIR traces."},{"wmode":0,"bbox":{"x":54,"y":460,"w":48,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":468,"text":"For example,"},{"wmode":0,"bbox":{"x":102,"y":462,"w":22,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":102,"y":468,"text":" eval"},{"wmode":0,"bbox":{"x":124,"y":460,"w":168,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":124,"y":468,"text":" or calls to external functions can change the"},{"wmode":0,"bbox":{"x":54,"y":470,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":478,"text":"program state in unpredictable ways, making it difficult for the"},{"wmode":0,"bbox":{"x":54,"y":480,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":488,"text":"tracer to know the current type map in order to continue tracing."},{"wmode":0,"bbox":{"x":54,"y":490,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":498,"text":"A tracing implementation can also have any number of other limi-"},{"wmode":0,"bbox":{"x":54,"y":500,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":508,"text":"tations, e.g.,a small-memory device may limit the length of traces."},{"wmode":0,"bbox":{"x":54,"y":510,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":518,"text":"When any situation occurs that prevents the implementation from"},{"wmode":0,"bbox":{"x":54,"y":520,"w":167,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":528,"text":"continuing trace recording, the implementation"},{"wmode":0,"bbox":{"x":221,"y":520,"w":24,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":221,"y":528,"text":" aborts"},{"wmode":0,"bbox":{"x":246,"y":520,"w":47,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":246,"y":528,"text":" trace record-"},{"wmode":0,"bbox":{"x":54,"y":530,"w":128,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":538,"text":"ing and returns to the trace monitor."}]},{"type":"text","bbox":{"x":54,"y":554,"w":64,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":554,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":563,"text":"3.2"},{"wmode":0,"bbox":{"x":74,"y":554,"w":44,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":563,"text":"Trace Trees"}]},{"type":"text","bbox":{"x":54,"y":568,"w":239,"h":110},"lines":[{"wmode":0,"bbox":{"x":54,"y":568,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":577,"text":"Especially simple loops, namely those where control flow, value"},{"wmode":0,"bbox":{"x":54,"y":578,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":586,"text":"types, value representations, and inlined functions are all invariant,"},{"wmode":0,"bbox":{"x":54,"y":588,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":596,"text":"can be represented by a single trace. But most loops have at least"},{"wmode":0,"bbox":{"x":54,"y":598,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":606,"text":"some variation, and so the program will take side exits from the"},{"wmode":0,"bbox":{"x":54,"y":608,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":616,"text":"main trace. When a side exit becomes hot, TraceMonkey starts a"},{"wmode":0,"bbox":{"x":54,"y":618,"w":14,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":626,"text":"new"},{"wmode":0,"bbox":{"x":68,"y":618,"w":48,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":68,"y":626,"text":" branch trace"},{"wmode":0,"bbox":{"x":116,"y":618,"w":176,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":116,"y":626,"text":" from that point and patches the side exit to jump"},{"wmode":0,"bbox":{"x":54,"y":628,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":636,"text":"directly to that trace. In this way, a single trace expands on demand"},{"wmode":0,"bbox":{"x":54,"y":638,"w":108,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":646,"text":"to a single-entry, multiple-exit"},{"wmode":0,"bbox":{"x":162,"y":638,"w":36,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":162,"y":646,"text":" trace tree"},{"wmode":0,"bbox":{"x":198,"y":638,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":198,"y":646,"text":"."},{"wmode":0,"bbox":{"x":65,"y":648,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":656,"text":"This section explains how trace trees are formed during execu-"},{"wmode":0,"bbox":{"x":54,"y":658,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":666,"text":"tion. The goal is to form trace trees during execution that cover all"},{"wmode":0,"bbox":{"x":54,"y":668,"w":103,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":676,"text":"the hot paths of the program."}]},{"type":"text","bbox":{"x":54,"y":695,"w":239,"h":30},"lines":[{"wmode":0,"bbox":{"x":54,"y":697,"w":2,"h":7},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":5},"x":54,"y":702,"text":"1"},{"wmode":0,"bbox":{"x":56,"y":695,"w":236,"h":12},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":56,"y":702,"text":" Arrays are actually worse than this: if the index value is a number, it must"},{"wmode":0,"bbox":{"x":54,"y":707,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":54,"y":714,"text":"be converted from a double to a string for the property access operator, and"},{"wmode":0,"bbox":{"x":54,"y":716,"w":180,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":54,"y":723,"text":"then to an integer internally to the array implementation."}]},{"type":"text","bbox":{"x":317,"y":71,"w":239,"h":648},"lines":[{"wmode":0,"bbox":{"x":328,"y":71,"w":57,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":79,"text":"Starting a tree."},{"wmode":0,"bbox":{"x":385,"y":71,"w":170,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":385,"y":79,"text":" Tree trees always start at loop headers, because"},{"wmode":0,"bbox":{"x":317,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":89,"text":"they are a natural place to look for hot paths. In TraceMonkey, loop"},{"wmode":0,"bbox":{"x":317,"y":91,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":99,"text":"headers are easy to detect–the bytecode compiler ensures that a"},{"wmode":0,"bbox":{"x":317,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":109,"text":"bytecode is a loop header iff it is the target of a backward branch."},{"wmode":0,"bbox":{"x":317,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":119,"text":"TraceMonkey starts a tree when a given loop header has been exe-"},{"wmode":0,"bbox":{"x":317,"y":121,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":129,"text":"cuted a certain number of times (2 in the current implementation)."},{"wmode":0,"bbox":{"x":317,"y":131,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":139,"text":"Starting a tree just means starting recording a trace for the current"},{"wmode":0,"bbox":{"x":317,"y":141,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":149,"text":"point and type map and marking the trace as the root of a tree. Each"},{"wmode":0,"bbox":{"x":317,"y":151,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":159,"text":"tree is associated with a loop header and type map, so there may be"},{"wmode":0,"bbox":{"x":317,"y":161,"w":130,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":169,"text":"several trees for a given loop header."},{"wmode":0,"bbox":{"x":328,"y":170,"w":64,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":179,"text":"Closing the loop."},{"wmode":0,"bbox":{"x":392,"y":171,"w":148,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":392,"y":179,"text":" Trace recording can end in several ways."},{"wmode":0,"bbox":{"x":328,"y":181,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":189,"text":"Ideally, the trace reaches the loop header where it started with"},{"wmode":0,"bbox":{"x":317,"y":191,"w":177,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":199,"text":"the same type map as on entry. This is called a"},{"wmode":0,"bbox":{"x":494,"y":191,"w":42,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":494,"y":199,"text":" type-stable"},{"wmode":0,"bbox":{"x":536,"y":191,"w":19,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":536,"y":199,"text":" loop"},{"wmode":0,"bbox":{"x":317,"y":201,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":209,"text":"iteration. In this case, the end of the trace can jump right to the"},{"wmode":0,"bbox":{"x":317,"y":211,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":219,"text":"beginning, as all the value representations are exactly as needed to"},{"wmode":0,"bbox":{"x":317,"y":221,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":229,"text":"enter the trace. The jump can even skip the usual code that would"},{"wmode":0,"bbox":{"x":317,"y":231,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":239,"text":"copy out the state at the end of the trace and copy it back in to the"},{"wmode":0,"bbox":{"x":317,"y":241,"w":137,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":249,"text":"trace activation record to enter a trace."},{"wmode":0,"bbox":{"x":328,"y":251,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":259,"text":"In certain cases the trace might reach the loop header with a"},{"wmode":0,"bbox":{"x":317,"y":260,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":269,"text":"different type map. This scenario is sometime observed for the first"},{"wmode":0,"bbox":{"x":317,"y":270,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":279,"text":"iteration of a loop. Some variables inside the loop might initially be"},{"wmode":0,"bbox":{"x":317,"y":280,"w":34,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":317,"y":289,"text":"undefined"},{"wmode":0,"bbox":{"x":351,"y":280,"w":204,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":351,"y":289,"text":", before they are set to a concrete type during the first loop"},{"wmode":0,"bbox":{"x":317,"y":290,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":299,"text":"iteration. When recording such an iteration, the recorder cannot"},{"wmode":0,"bbox":{"x":317,"y":300,"w":186,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":309,"text":"link the trace back to its own loop header since it is"},{"wmode":0,"bbox":{"x":503,"y":300,"w":50,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":503,"y":309,"text":" type-unstable"},{"wmode":0,"bbox":{"x":553,"y":300,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":553,"y":309,"text":"."},{"wmode":0,"bbox":{"x":317,"y":310,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":319,"text":"Instead, the iteration is terminated with a side exit that will always"},{"wmode":0,"bbox":{"x":317,"y":320,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":329,"text":"fail and return to the interpreter. At the same time a new trace is"},{"wmode":0,"bbox":{"x":317,"y":330,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":338,"text":"recorded with the new type map. Every time an additional type-"},{"wmode":0,"bbox":{"x":317,"y":340,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":348,"text":"unstable trace is added to a region, its exit type map is compared to"},{"wmode":0,"bbox":{"x":317,"y":350,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":358,"text":"the entry map of all existing traces in case they complement each"},{"wmode":0,"bbox":{"x":317,"y":360,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":368,"text":"other. With this approach we are able to cover type-unstable loop"},{"wmode":0,"bbox":{"x":317,"y":370,"w":213,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":378,"text":"iterations as long they eventually form a stable equilibrium."},{"wmode":0,"bbox":{"x":328,"y":380,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":388,"text":"Finally, the trace might exit the loop before reaching the loop"},{"wmode":0,"bbox":{"x":317,"y":390,"w":173,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":398,"text":"header, for example because execution reaches a"},{"wmode":0,"bbox":{"x":490,"y":392,"w":25,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":490,"y":398,"text":" break"},{"wmode":0,"bbox":{"x":516,"y":390,"w":9,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":516,"y":398,"text":" or"},{"wmode":0,"bbox":{"x":525,"y":392,"w":30,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":525,"y":398,"text":" return"},{"wmode":0,"bbox":{"x":317,"y":400,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":408,"text":"statement. In this case, the VM simply ends the trace with an exit"},{"wmode":0,"bbox":{"x":317,"y":410,"w":72,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":418,"text":"to the trace monitor."},{"wmode":0,"bbox":{"x":328,"y":420,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":428,"text":"As mentioned previously, we may speculatively chose to rep-"},{"wmode":0,"bbox":{"x":317,"y":430,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":438,"text":"resent certain Number-typed values as integers on trace. We do so"},{"wmode":0,"bbox":{"x":317,"y":440,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":448,"text":"when we observe that Number-typed variables contain an integer"},{"wmode":0,"bbox":{"x":317,"y":450,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":458,"text":"value at trace entry. If during trace recording the variable is unex-"},{"wmode":0,"bbox":{"x":317,"y":460,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":468,"text":"pectedly assigned a non-integer value, we have to widen the type"},{"wmode":0,"bbox":{"x":317,"y":470,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":478,"text":"of the variable to a double. As a result, the recorded trace becomes"},{"wmode":0,"bbox":{"x":317,"y":480,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":488,"text":"inherently type-unstable since it starts with an integer value but"},{"wmode":0,"bbox":{"x":317,"y":490,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":498,"text":"ends with a double value. This represents a mis-speculation, since"},{"wmode":0,"bbox":{"x":317,"y":500,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":508,"text":"at trace entry we specialized the Number-typed value to an integer,"},{"wmode":0,"bbox":{"x":317,"y":510,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":518,"text":"assuming that at the loop edge we would again find an integer value"},{"wmode":0,"bbox":{"x":317,"y":520,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":528,"text":"in the variable, allowing us to close the loop. To avoid future spec-"},{"wmode":0,"bbox":{"x":317,"y":529,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":538,"text":"ulative failures involving this variable, and to obtain a type-stable"},{"wmode":0,"bbox":{"x":317,"y":539,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":548,"text":"trace we note the fact that the variable in question as been observed"},{"wmode":0,"bbox":{"x":317,"y":549,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":558,"text":"to sometimes hold non-integer values in an advisory data structure"},{"wmode":0,"bbox":{"x":317,"y":559,"w":97,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":568,"text":"which we call the “oracle”."},{"wmode":0,"bbox":{"x":328,"y":569,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":578,"text":"When compiling loops, we consult the oracle before specializ-"},{"wmode":0,"bbox":{"x":317,"y":579,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":588,"text":"ing values to integers. Speculation towards integers is performed"},{"wmode":0,"bbox":{"x":317,"y":589,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":598,"text":"only if no adverse information is known to the oracle about that"},{"wmode":0,"bbox":{"x":317,"y":599,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":607,"text":"particular variable. Whenever we accidentally compile a loop that"},{"wmode":0,"bbox":{"x":317,"y":609,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":617,"text":"is type-unstable due to mis-speculation of a Number-typed vari-"},{"wmode":0,"bbox":{"x":317,"y":619,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":627,"text":"able, we immediately trigger the recording of a new trace, which"},{"wmode":0,"bbox":{"x":317,"y":629,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":637,"text":"based on the now updated oracle information will start with a dou-"},{"wmode":0,"bbox":{"x":317,"y":639,"w":137,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":647,"text":"ble value and thus become type stable."},{"wmode":0,"bbox":{"x":328,"y":649,"w":68,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":657,"text":"Extending a tree."},{"wmode":0,"bbox":{"x":397,"y":649,"w":158,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":397,"y":657,"text":" Side exits lead to different paths through"},{"wmode":0,"bbox":{"x":317,"y":659,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":667,"text":"the loop, or paths with different types or representations. Thus, to"},{"wmode":0,"bbox":{"x":317,"y":669,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":677,"text":"completely cover the loop, the VM must record traces starting at all"},{"wmode":0,"bbox":{"x":317,"y":679,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":687,"text":"side exits. These traces are recorded much like root traces: there is"},{"wmode":0,"bbox":{"x":317,"y":689,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":697,"text":"a counter for each side exit, and when the counter reaches a hotness"},{"wmode":0,"bbox":{"x":317,"y":699,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":707,"text":"threshold, recording starts. Recording stops exactly as for the root"},{"wmode":0,"bbox":{"x":317,"y":709,"w":236,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":717,"text":"trace, using the loop header of the root trace as the target to reach."}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":239,"h":50},"lines":[{"wmode":0,"bbox":{"x":65,"y":71,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":79,"text":"Our implementation does not extend at all side exits. It extends"},{"wmode":0,"bbox":{"x":54,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":89,"text":"only if the side exit is for a control-flow branch, and only if the side"},{"wmode":0,"bbox":{"x":54,"y":91,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":99,"text":"exit does not leave the loop. In particular we do not want to extend"},{"wmode":0,"bbox":{"x":54,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":109,"text":"a trace tree along a path that leads to an outer loop, because we"},{"wmode":0,"bbox":{"x":54,"y":111,"w":190,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":119,"text":"want to cover such paths in an outer tree through tree"},{"wmode":0,"bbox":{"x":244,"y":111,"w":28,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":244,"y":119,"text":" nesting"},{"wmode":0,"bbox":{"x":272,"y":111,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":272,"y":119,"text":"."}]},{"type":"text","bbox":{"x":54,"y":128,"w":65,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":128,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":137,"text":"3.3"},{"wmode":0,"bbox":{"x":74,"y":128,"w":45,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":137,"text":"Blacklisting"}]},{"type":"text","bbox":{"x":54,"y":143,"w":239,"h":359},"lines":[{"wmode":0,"bbox":{"x":54,"y":143,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":151,"text":"Sometimes, a program follows a path that cannot be compiled"},{"wmode":0,"bbox":{"x":54,"y":152,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":161,"text":"into a trace, usually because of limitations in the implementation."},{"wmode":0,"bbox":{"x":54,"y":162,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":171,"text":"TraceMonkey does not currently support recording throwing and"},{"wmode":0,"bbox":{"x":54,"y":172,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":181,"text":"catching of arbitrary exceptions. This design trade off was chosen,"},{"wmode":0,"bbox":{"x":54,"y":182,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":191,"text":"because exceptions are usually rare in JavaScript. However, if a"},{"wmode":0,"bbox":{"x":54,"y":192,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":201,"text":"program opts to use exceptions intensively, we would suddenly"},{"wmode":0,"bbox":{"x":54,"y":202,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":211,"text":"incur a punishing runtime overhead if we repeatedly try to record"},{"wmode":0,"bbox":{"x":54,"y":212,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":221,"text":"a trace for this path and repeatedly fail to do so, since we abort"},{"wmode":0,"bbox":{"x":54,"y":222,"w":207,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":231,"text":"tracing every time we observe an exception being thrown."},{"wmode":0,"bbox":{"x":65,"y":232,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":240,"text":"As a result, if a hot loop contains traces that always fail, the VM"},{"wmode":0,"bbox":{"x":54,"y":242,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":250,"text":"could potentially run much more slowly than the base interpreter:"},{"wmode":0,"bbox":{"x":54,"y":252,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":260,"text":"the VM repeatedly spends time trying to record traces, but is never"},{"wmode":0,"bbox":{"x":54,"y":262,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":270,"text":"able to run any. To avoid this problem, whenever the VM is about"},{"wmode":0,"bbox":{"x":54,"y":272,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":280,"text":"to start tracing, it must try to predict whether it will finish the trace."},{"wmode":0,"bbox":{"x":65,"y":282,"w":139,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":290,"text":"Our prediction algorithm is based on"},{"wmode":0,"bbox":{"x":205,"y":282,"w":45,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":205,"y":290,"text":" blacklisting"},{"wmode":0,"bbox":{"x":251,"y":282,"w":42,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":290,"text":" traces that"},{"wmode":0,"bbox":{"x":54,"y":292,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":300,"text":"have been tried and failed. When the VM fails to finish a trace start-"},{"wmode":0,"bbox":{"x":54,"y":302,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":310,"text":"ing at a given point, the VM records that a failure has occurred. The"},{"wmode":0,"bbox":{"x":54,"y":312,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":320,"text":"VM also sets a counter so that it will not try to record a trace starting"},{"wmode":0,"bbox":{"x":54,"y":322,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":330,"text":"at that point until it is passed a few more times (32 in our imple-"},{"wmode":0,"bbox":{"x":54,"y":332,"w":60,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":340,"text":"mentation). This"},{"wmode":0,"bbox":{"x":114,"y":332,"w":29,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":114,"y":340,"text":" backoff"},{"wmode":0,"bbox":{"x":143,"y":332,"w":149,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":143,"y":340,"text":" counter gives temporary conditions that"},{"wmode":0,"bbox":{"x":54,"y":342,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":350,"text":"prevent tracing a chance to end. For example, a loop may behave"},{"wmode":0,"bbox":{"x":54,"y":352,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":360,"text":"differently during startup than during its steady-state execution. Af-"},{"wmode":0,"bbox":{"x":54,"y":362,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":370,"text":"ter a given number of failures (2 in our implementation), the VM"},{"wmode":0,"bbox":{"x":54,"y":372,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":380,"text":"marks the fragment as blacklisted, which means the VM will never"},{"wmode":0,"bbox":{"x":54,"y":382,"w":120,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":390,"text":"again start recording at that point."},{"wmode":0,"bbox":{"x":65,"y":392,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":400,"text":"After implementing this basic strategy, we observed that for"},{"wmode":0,"bbox":{"x":54,"y":402,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":410,"text":"small loops that get blacklisted, the system can spend a noticeable"},{"wmode":0,"bbox":{"x":54,"y":412,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":420,"text":"amount of time just finding the loop fragment and determining that"},{"wmode":0,"bbox":{"x":54,"y":421,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":430,"text":"it has been blacklisted. We now avoid that problem by patching the"},{"wmode":0,"bbox":{"x":54,"y":431,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":440,"text":"bytecode. We define an extra no-op bytecode that indicates a loop"},{"wmode":0,"bbox":{"x":54,"y":441,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":450,"text":"header. The VM calls into the trace monitor every time the inter-"},{"wmode":0,"bbox":{"x":54,"y":451,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":460,"text":"preter executes a loop header no-op. To blacklist a fragment, we"},{"wmode":0,"bbox":{"x":54,"y":461,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":470,"text":"simply replace the loop header no-op with a regular no-op. Thus,"},{"wmode":0,"bbox":{"x":54,"y":471,"w":225,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":480,"text":"the interpreter will never again even call into the trace monitor."},{"wmode":0,"bbox":{"x":65,"y":481,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":490,"text":"There is a related problem we have not yet solved, which occurs"},{"wmode":0,"bbox":{"x":54,"y":491,"w":150,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":499,"text":"when a loop meets all of these conditions:"}]},{"type":"text","bbox":{"x":59,"y":505,"w":197,"h":15},"lines":[{"wmode":0,"bbox":{"x":59,"y":507,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":513,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":505,"w":193,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":513,"text":" The VM can form at least one root trace for the loop."}]},{"type":"text","bbox":{"x":59,"y":519,"w":233,"h":21},"lines":[{"wmode":0,"bbox":{"x":59,"y":521,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":527,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":519,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":527,"text":" There is at least one hot side exit for which the VM cannot"},{"wmode":0,"bbox":{"x":66,"y":530,"w":60,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":538,"text":"complete a trace."}]},{"type":"text","bbox":{"x":59,"y":543,"w":90,"h":15},"lines":[{"wmode":0,"bbox":{"x":59,"y":545,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":551,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":543,"w":86,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":551,"text":" The loop body is short."}]},{"type":"text","bbox":{"x":54,"y":559,"w":239,"h":100},"lines":[{"wmode":0,"bbox":{"x":65,"y":559,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":567,"text":"In this case, the VM will repeatedly pass the loop header, search"},{"wmode":0,"bbox":{"x":54,"y":569,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":577,"text":"for a trace, find it, execute it, and fall back to the interpreter."},{"wmode":0,"bbox":{"x":54,"y":579,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":587,"text":"With a short loop body, the overhead of finding and calling the"},{"wmode":0,"bbox":{"x":54,"y":589,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":597,"text":"trace is high, and causes performance to be even slower than the"},{"wmode":0,"bbox":{"x":54,"y":599,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":607,"text":"basic interpreter. So far, in this situation we have improved the"},{"wmode":0,"bbox":{"x":54,"y":609,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":617,"text":"implementation so that the VM can complete the branch trace."},{"wmode":0,"bbox":{"x":54,"y":619,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":627,"text":"But it is hard to guarantee that this situation will never happen."},{"wmode":0,"bbox":{"x":54,"y":628,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":637,"text":"As future work, this situation could be avoided by detecting and"},{"wmode":0,"bbox":{"x":54,"y":638,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":647,"text":"blacklisting loops for which the average trace call executes few"},{"wmode":0,"bbox":{"x":54,"y":648,"w":159,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":657,"text":"bytecodes before returning to the interpreter."}]},{"type":"text","bbox":{"x":54,"y":669,"w":156,"h":14},"lines":[{"wmode":0,"bbox":{"x":54,"y":669,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":54,"y":679,"text":"4."},{"wmode":0,"bbox":{"x":73,"y":669,"w":136,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":73,"y":679,"text":"Nested Trace Tree Formation"}]},{"type":"text","bbox":{"x":54,"y":685,"w":239,"h":40},"lines":[{"wmode":0,"bbox":{"x":54,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":693,"text":"Figure 7 shows basic trace tree compilation (11) applied to a nested"},{"wmode":0,"bbox":{"x":54,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":703,"text":"loop where the inner loop contains two paths. Usually, the inner"},{"wmode":0,"bbox":{"x":54,"y":705,"w":71,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":713,"text":"loop (with header at"},{"wmode":0,"bbox":{"x":125,"y":706,"w":5,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":125,"y":713,"text":" i"},{"wmode":0,"bbox":{"x":130,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":130,"y":714,"text":"2"},{"wmode":0,"bbox":{"x":135,"y":705,"w":157,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":135,"y":713,"text":") becomes hot first, and a trace tree is rooted"},{"wmode":0,"bbox":{"x":54,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":723,"text":"at that point. For example, the first recorded trace may be a cycle"}]},{"type":"text","bbox":{"x":407,"y":81,"w":4,"h":10},"lines":[{"wmode":0,"bbox":{"x":407,"y":81,"w":4,"h":10},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":8},"x":407,"y":89,"text":"T"}]},{"type":"text","bbox":{"x":449,"y":103,"w":21,"h":5},"lines":[{"wmode":0,"bbox":{"x":449,"y":103,"w":2,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":449,"y":108,"text":"T"},{"wmode":0,"bbox":{"x":451,"y":103,"w":11,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":451,"y":108,"text":"runk T"},{"wmode":0,"bbox":{"x":463,"y":103,"w":1,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":463,"y":108,"text":"r"},{"wmode":0,"bbox":{"x":464,"y":103,"w":6,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":464,"y":108,"text":"ace"}]},{"type":"text","bbox":{"x":449,"y":93,"w":22,"h":5},"lines":[{"wmode":0,"bbox":{"x":449,"y":93,"w":2,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":449,"y":98,"text":"T"},{"wmode":0,"bbox":{"x":450,"y":93,"w":1,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":450,"y":98,"text":"r"},{"wmode":0,"bbox":{"x":452,"y":93,"w":18,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":452,"y":98,"text":"ee Anchor"}]},{"type":"text","bbox":{"x":448,"y":113,"w":24,"h":5},"lines":[{"wmode":0,"bbox":{"x":448,"y":113,"w":2,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":448,"y":118,"text":"T"},{"wmode":0,"bbox":{"x":450,"y":113,"w":1,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":450,"y":118,"text":"r"},{"wmode":0,"bbox":{"x":451,"y":113,"w":20,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":451,"y":118,"text":"ace Anchor"}]},{"type":"text","bbox":{"x":448,"y":123,"w":23,"h":5},"lines":[{"wmode":0,"bbox":{"x":448,"y":123,"w":4,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":448,"y":128,"text":"Br"},{"wmode":0,"bbox":{"x":452,"y":123,"w":12,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":452,"y":128,"text":"anch T"},{"wmode":0,"bbox":{"x":464,"y":123,"w":1,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":464,"y":128,"text":"r"},{"wmode":0,"bbox":{"x":465,"y":123,"w":6,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":465,"y":128,"text":"ace"}]},{"type":"text","bbox":{"x":454,"y":133,"w":11,"h":5},"lines":[{"wmode":0,"bbox":{"x":454,"y":133,"w":9,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":454,"y":138,"text":"Guar"},{"wmode":0,"bbox":{"x":463,"y":133,"w":2,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":463,"y":138,"text":"d"}]},{"type":"text","bbox":{"x":452,"y":144,"w":15,"h":5},"lines":[{"wmode":0,"bbox":{"x":452,"y":144,"w":15,"h":5},"font":{"name":"NVCFEO+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":452,"y":148,"text":"Side Exit"}]},{"type":"text","bbox":{"x":317,"y":221,"w":239,"h":50},"lines":[{"wmode":0,"bbox":{"x":317,"y":221,"w":35,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":229,"text":"Figure 5."},{"wmode":0,"bbox":{"x":352,"y":221,"w":203,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":352,"y":229,"text":" A tree with two traces, a trunk trace and one branch"},{"wmode":0,"bbox":{"x":317,"y":231,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":239,"text":"trace. The trunk trace contains a guard to which a branch trace was"},{"wmode":0,"bbox":{"x":317,"y":241,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":249,"text":"attached. The branch trace contain a guard that may fail and trigger"},{"wmode":0,"bbox":{"x":317,"y":251,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":259,"text":"a side exit. Both the trunk and the branch trace loop back to the tree"},{"wmode":0,"bbox":{"x":317,"y":261,"w":170,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":269,"text":"anchor, which is the beginning of the trace tree."}]},{"type":"text","bbox":{"x":367,"y":294,"w":136,"h":5},"lines":[{"wmode":0,"bbox":{"x":400,"y":294,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":400,"y":299,"text":"T"},{"wmode":0,"bbox":{"x":402,"y":294,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":402,"y":299,"text":"r"},{"wmode":0,"bbox":{"x":404,"y":294,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":404,"y":299,"text":"ace 2"},{"wmode":0,"bbox":{"x":367,"y":294,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":367,"y":299,"text":"T"},{"wmode":0,"bbox":{"x":369,"y":294,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":369,"y":299,"text":"r"},{"wmode":0,"bbox":{"x":370,"y":294,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":370,"y":299,"text":"ace 1"},{"wmode":0,"bbox":{"x":490,"y":294,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":490,"y":299,"text":"T"},{"wmode":0,"bbox":{"x":492,"y":294,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":492,"y":299,"text":"r"},{"wmode":0,"bbox":{"x":493,"y":294,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":493,"y":299,"text":"ace 2"},{"wmode":0,"bbox":{"x":456,"y":294,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":456,"y":299,"text":"T"},{"wmode":0,"bbox":{"x":458,"y":294,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":458,"y":299,"text":"r"},{"wmode":0,"bbox":{"x":460,"y":294,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":460,"y":299,"text":"ace 1"}]},{"type":"text","bbox":{"x":367,"y":361,"w":135,"h":5},"lines":[{"wmode":0,"bbox":{"x":367,"y":361,"w":12,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":367,"y":365,"text":"Closed"},{"wmode":0,"bbox":{"x":401,"y":361,"w":7,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":401,"y":365,"text":"Link"},{"wmode":0,"bbox":{"x":408,"y":361,"w":4,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":408,"y":365,"text":"ed"},{"wmode":0,"bbox":{"x":457,"y":361,"w":7,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":457,"y":365,"text":"Link"},{"wmode":0,"bbox":{"x":464,"y":361,"w":4,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":464,"y":365,"text":"ed"},{"wmode":0,"bbox":{"x":490,"y":361,"w":7,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":490,"y":365,"text":"Link"},{"wmode":0,"bbox":{"x":498,"y":361,"w":4,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":498,"y":365,"text":"ed"}]},{"type":"text","bbox":{"x":358,"y":401,"w":12,"h":4},"lines":[{"wmode":0,"bbox":{"x":358,"y":401,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":358,"y":405,"text":"Number"}]},{"type":"text","bbox":{"x":397,"y":439,"w":12,"h":4},"lines":[{"wmode":0,"bbox":{"x":397,"y":439,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":397,"y":443,"text":"Number"}]},{"type":"text","bbox":{"x":485,"y":403,"w":9,"h":4},"lines":[{"wmode":0,"bbox":{"x":485,"y":403,"w":9,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":485,"y":407,"text":"String"}]},{"type":"text","bbox":{"x":441,"y":439,"w":53,"h":5},"lines":[{"wmode":0,"bbox":{"x":441,"y":439,"w":9,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":441,"y":443,"text":"String"},{"wmode":0,"bbox":{"x":485,"y":439,"w":9,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":485,"y":442,"text":"String"}]},{"type":"text","bbox":{"x":362,"y":446,"w":9,"h":4},"lines":[{"wmode":0,"bbox":{"x":362,"y":446,"w":9,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":362,"y":450,"text":"String"}]},{"type":"text","bbox":{"x":441,"y":402,"w":12,"h":4},"lines":[{"wmode":0,"bbox":{"x":441,"y":402,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":441,"y":405,"text":"Boolean"}]},{"type":"text","bbox":{"x":367,"y":385,"w":137,"h":5},"lines":[{"wmode":0,"bbox":{"x":431,"y":385,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":431,"y":389,"text":"T"},{"wmode":0,"bbox":{"x":433,"y":385,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":433,"y":389,"text":"r"},{"wmode":0,"bbox":{"x":434,"y":385,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":434,"y":389,"text":"ace 2"},{"wmode":0,"bbox":{"x":367,"y":385,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":367,"y":389,"text":"T"},{"wmode":0,"bbox":{"x":369,"y":385,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":369,"y":389,"text":"r"},{"wmode":0,"bbox":{"x":370,"y":385,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":370,"y":389,"text":"ace 1"},{"wmode":0,"bbox":{"x":490,"y":385,"w":2,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":490,"y":389,"text":"T"},{"wmode":0,"bbox":{"x":492,"y":385,"w":1,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":492,"y":389,"text":"r"},{"wmode":0,"bbox":{"x":494,"y":385,"w":10,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":494,"y":389,"text":"ace 3"}]},{"type":"text","bbox":{"x":367,"y":455,"w":135,"h":9},"lines":[{"wmode":0,"bbox":{"x":367,"y":459,"w":7,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":367,"y":463,"text":"Link"},{"wmode":0,"bbox":{"x":375,"y":459,"w":4,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":375,"y":463,"text":"ed"},{"wmode":0,"bbox":{"x":406,"y":455,"w":7,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":406,"y":459,"text":"Link"},{"wmode":0,"bbox":{"x":414,"y":455,"w":4,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":414,"y":459,"text":"ed"},{"wmode":0,"bbox":{"x":431,"y":455,"w":7,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":431,"y":459,"text":"Link"},{"wmode":0,"bbox":{"x":439,"y":455,"w":4,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":439,"y":459,"text":"ed"},{"wmode":0,"bbox":{"x":490,"y":455,"w":12,"h":5},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":490,"y":459,"text":"Closed"}]},{"type":"text","bbox":{"x":358,"y":311,"w":12,"h":4},"lines":[{"wmode":0,"bbox":{"x":358,"y":311,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":358,"y":314,"text":"Number"}]},{"type":"text","bbox":{"x":358,"y":350,"w":64,"h":4},"lines":[{"wmode":0,"bbox":{"x":358,"y":350,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":358,"y":353,"text":"Number"},{"wmode":0,"bbox":{"x":410,"y":350,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":410,"y":353,"text":"Number"}]},{"type":"text","bbox":{"x":410,"y":311,"w":50,"h":4},"lines":[{"wmode":0,"bbox":{"x":410,"y":311,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":410,"y":314,"text":"Boolean"},{"wmode":0,"bbox":{"x":447,"y":311,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":447,"y":314,"text":"Number"}]},{"type":"text","bbox":{"x":447,"y":350,"w":64,"h":4},"lines":[{"wmode":0,"bbox":{"x":447,"y":350,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":447,"y":353,"text":"Boolean"},{"wmode":0,"bbox":{"x":499,"y":350,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":499,"y":353,"text":"Number"}]},{"type":"text","bbox":{"x":499,"y":311,"w":12,"h":4},"lines":[{"wmode":0,"bbox":{"x":499,"y":311,"w":12,"h":4},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":499,"y":314,"text":"Boolean"}]},{"type":"text","bbox":{"x":387,"y":366,"w":96,"h":8},"lines":[{"wmode":0,"bbox":{"x":387,"y":367,"w":7,"h":7},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":6},"x":387,"y":373,"text":"(a)"},{"wmode":0,"bbox":{"x":476,"y":366,"w":7,"h":7},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":6},"x":476,"y":372,"text":"(b)"}]},{"type":"text","bbox":{"x":436,"y":463,"w":6,"h":7},"lines":[{"wmode":0,"bbox":{"x":436,"y":463,"w":6,"h":7},"font":{"name":"ZBVPYI+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":6},"x":436,"y":470,"text":"(c)"}]},{"type":"text","bbox":{"x":317,"y":489,"w":239,"h":90},"lines":[{"wmode":0,"bbox":{"x":317,"y":489,"w":35,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":498,"text":"Figure 6."},{"wmode":0,"bbox":{"x":352,"y":489,"w":203,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":352,"y":498,"text":" We handle type-unstable loops by allowing traces to"},{"wmode":0,"bbox":{"x":317,"y":499,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":508,"text":"compile that cannot loop back to themselves due to a type mis-"},{"wmode":0,"bbox":{"x":317,"y":509,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":518,"text":"match. As such traces accumulate, we attempt to connect their loop"},{"wmode":0,"bbox":{"x":317,"y":519,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":528,"text":"edges to form groups of trace trees that can execute without having"},{"wmode":0,"bbox":{"x":317,"y":529,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":538,"text":"to side-exit to the interpreter to cover odd type cases. This is par-"},{"wmode":0,"bbox":{"x":317,"y":539,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":548,"text":"ticularly important for nested trace trees where an outer tree tries to"},{"wmode":0,"bbox":{"x":317,"y":549,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":558,"text":"call an inner tree (or in this case a forest of inner trees), since inner"},{"wmode":0,"bbox":{"x":317,"y":559,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":567,"text":"loops frequently have initially undefined values which change type"},{"wmode":0,"bbox":{"x":317,"y":569,"w":149,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":577,"text":"to a concrete value after the first iteration."}]},{"type":"text","bbox":{"x":317,"y":595,"w":239,"h":130},"lines":[{"wmode":0,"bbox":{"x":317,"y":595,"w":86,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":604,"text":"through the inner loop,"},{"wmode":0,"bbox":{"x":403,"y":597,"w":8,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":403,"y":604,"text":" {"},{"wmode":0,"bbox":{"x":411,"y":597,"w":3,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":411,"y":604,"text":"i"},{"wmode":0,"bbox":{"x":414,"y":600,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":414,"y":605,"text":"2"},{"wmode":0,"bbox":{"x":418,"y":597,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":418,"y":604,"text":", i"},{"wmode":0,"bbox":{"x":426,"y":600,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":426,"y":605,"text":"3"},{"wmode":0,"bbox":{"x":430,"y":597,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":430,"y":604,"text":", i"},{"wmode":0,"bbox":{"x":437,"y":600,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":437,"y":605,"text":"5"},{"wmode":0,"bbox":{"x":441,"y":597,"w":10,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":441,"y":604,"text":", α"},{"wmode":0,"bbox":{"x":451,"y":597,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":451,"y":604,"text":"}"},{"wmode":0,"bbox":{"x":456,"y":595,"w":19,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":456,"y":604,"text":". The"},{"wmode":0,"bbox":{"x":476,"y":597,"w":9,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":476,"y":604,"text":" α"},{"wmode":0,"bbox":{"x":485,"y":595,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":485,"y":604,"text":" symbol is used to"},{"wmode":0,"bbox":{"x":317,"y":605,"w":175,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":613,"text":"indicate that the trace loops back the tree anchor."},{"wmode":0,"bbox":{"x":328,"y":615,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":623,"text":"When execution leaves the inner loop, the basic design has two"},{"wmode":0,"bbox":{"x":317,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"choices. First, the system can stop tracing and give up on compiling"},{"wmode":0,"bbox":{"x":317,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"the outer loop, clearly an undesirable solution. The other choice is"},{"wmode":0,"bbox":{"x":317,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":653,"text":"to continue tracing, compiling traces for the outer loop inside the"},{"wmode":0,"bbox":{"x":317,"y":655,"w":80,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"inner loop’s trace tree."},{"wmode":0,"bbox":{"x":328,"y":665,"w":142,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":673,"text":"For example, the program might exit at"},{"wmode":0,"bbox":{"x":471,"y":667,"w":5,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":471,"y":673,"text":" i"},{"wmode":0,"bbox":{"x":477,"y":670,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":477,"y":674,"text":"5"},{"wmode":0,"bbox":{"x":480,"y":665,"w":75,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":480,"y":674,"text":" and record a branch"},{"wmode":0,"bbox":{"x":317,"y":675,"w":148,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"trace that incorporates the outer loop:"},{"wmode":0,"bbox":{"x":465,"y":676,"w":9,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":465,"y":683,"text":" {"},{"wmode":0,"bbox":{"x":474,"y":676,"w":3,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":474,"y":683,"text":"i"},{"wmode":0,"bbox":{"x":478,"y":680,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":478,"y":684,"text":"5"},{"wmode":0,"bbox":{"x":482,"y":676,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":482,"y":683,"text":", i"},{"wmode":0,"bbox":{"x":489,"y":680,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":489,"y":684,"text":"7"},{"wmode":0,"bbox":{"x":493,"y":676,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":493,"y":683,"text":", i"},{"wmode":0,"bbox":{"x":500,"y":680,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":500,"y":684,"text":"1"},{"wmode":0,"bbox":{"x":505,"y":676,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":505,"y":683,"text":", i"},{"wmode":0,"bbox":{"x":512,"y":680,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":512,"y":684,"text":"6"},{"wmode":0,"bbox":{"x":516,"y":676,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":516,"y":683,"text":", i"},{"wmode":0,"bbox":{"x":523,"y":680,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":523,"y":684,"text":"7"},{"wmode":0,"bbox":{"x":527,"y":676,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":527,"y":683,"text":", i"},{"wmode":0,"bbox":{"x":535,"y":680,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":535,"y":684,"text":"1"},{"wmode":0,"bbox":{"x":539,"y":676,"w":10,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":539,"y":683,"text":", α"},{"wmode":0,"bbox":{"x":549,"y":676,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":549,"y":683,"text":"}"},{"wmode":0,"bbox":{"x":553,"y":675,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":553,"y":683,"text":"."},{"wmode":0,"bbox":{"x":317,"y":685,"w":191,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":693,"text":"Later, the program might take the other branch at"},{"wmode":0,"bbox":{"x":508,"y":686,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":508,"y":693,"text":" i"},{"wmode":0,"bbox":{"x":515,"y":690,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":515,"y":694,"text":"2"},{"wmode":0,"bbox":{"x":519,"y":685,"w":37,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":519,"y":694,"text":" and then"},{"wmode":0,"bbox":{"x":317,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"exit, recording another branch trace incorporating the outer loop:"},{"wmode":0,"bbox":{"x":317,"y":706,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":317,"y":713,"text":"{"},{"wmode":0,"bbox":{"x":321,"y":706,"w":3,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":321,"y":713,"text":"i"},{"wmode":0,"bbox":{"x":324,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":324,"y":714,"text":"2"},{"wmode":0,"bbox":{"x":328,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":328,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":336,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":336,"y":714,"text":"4"},{"wmode":0,"bbox":{"x":340,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":340,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":347,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":347,"y":714,"text":"5"},{"wmode":0,"bbox":{"x":351,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":351,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":358,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":358,"y":714,"text":"7"},{"wmode":0,"bbox":{"x":363,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":363,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":370,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":370,"y":714,"text":"1"},{"wmode":0,"bbox":{"x":374,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":374,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":381,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":381,"y":714,"text":"6"},{"wmode":0,"bbox":{"x":385,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":385,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":393,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":393,"y":714,"text":"7"},{"wmode":0,"bbox":{"x":397,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":397,"y":713,"text":", i"},{"wmode":0,"bbox":{"x":404,"y":710,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":404,"y":714,"text":"1"},{"wmode":0,"bbox":{"x":408,"y":706,"w":10,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":408,"y":713,"text":", α"},{"wmode":0,"bbox":{"x":418,"y":706,"w":4,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":418,"y":713,"text":"}"},{"wmode":0,"bbox":{"x":423,"y":705,"w":132,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":423,"y":713,"text":". Thus, the outer loop is recorded and"},{"wmode":0,"bbox":{"x":317,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"compiled twice, and both copies must be retained in the trace cache."}]}]},{"blocks":[{"type":"text","bbox":{"x":133,"y":101,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":133,"y":101,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":133,"y":106,"text":"i"},{"wmode":0,"bbox":{"x":134,"y":103,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":134,"y":106,"text":"2"}]},{"type":"text","bbox":{"x":120,"y":128,"w":28,"h":5},"lines":[{"wmode":0,"bbox":{"x":120,"y":128,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":120,"y":132,"text":"i"},{"wmode":0,"bbox":{"x":122,"y":129,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":122,"y":132,"text":"3"},{"wmode":0,"bbox":{"x":146,"y":128,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":146,"y":132,"text":"i"},{"wmode":0,"bbox":{"x":147,"y":129,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":147,"y":132,"text":"4"}]},{"type":"text","bbox":{"x":133,"y":150,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":133,"y":150,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":133,"y":154,"text":"i"},{"wmode":0,"bbox":{"x":135,"y":151,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":135,"y":154,"text":"5"}]},{"type":"text","bbox":{"x":133,"y":80,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":133,"y":80,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":133,"y":84,"text":"i"},{"wmode":0,"bbox":{"x":134,"y":81,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":134,"y":84,"text":"1"}]},{"type":"text","bbox":{"x":102,"y":127,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":102,"y":127,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":102,"y":132,"text":"i"},{"wmode":0,"bbox":{"x":103,"y":128,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":103,"y":132,"text":"6"}]},{"type":"text","bbox":{"x":133,"y":171,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":133,"y":171,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":133,"y":176,"text":"i"},{"wmode":0,"bbox":{"x":134,"y":173,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":134,"y":176,"text":"7"}]},{"type":"text","bbox":{"x":178,"y":81,"w":3,"h":5},"lines":[{"wmode":0,"bbox":{"x":178,"y":81,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":178,"y":85,"text":"t"},{"wmode":0,"bbox":{"x":179,"y":82,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":179,"y":85,"text":"1"}]},{"type":"text","bbox":{"x":209,"y":125,"w":3,"h":5},"lines":[{"wmode":0,"bbox":{"x":209,"y":125,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":209,"y":129,"text":"t"},{"wmode":0,"bbox":{"x":211,"y":126,"w":1,"h":4},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":211,"y":129,"text":"2"}]},{"type":"text","bbox":{"x":222,"y":91,"w":14,"h":5},"lines":[{"wmode":0,"bbox":{"x":222,"y":91,"w":2,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":222,"y":95,"text":"T"},{"wmode":0,"bbox":{"x":224,"y":91,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":224,"y":95,"text":"r"},{"wmode":0,"bbox":{"x":226,"y":91,"w":11,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":226,"y":95,"text":"ee Call"}]},{"type":"text","bbox":{"x":211,"y":78,"w":18,"h":5},"lines":[{"wmode":0,"bbox":{"x":211,"y":78,"w":6,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":211,"y":82,"text":"Out"},{"wmode":0,"bbox":{"x":217,"y":78,"w":6,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":217,"y":82,"text":"er T"},{"wmode":0,"bbox":{"x":224,"y":78,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":224,"y":82,"text":"r"},{"wmode":0,"bbox":{"x":225,"y":78,"w":4,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":225,"y":82,"text":"ee"}]},{"type":"text","bbox":{"x":222,"y":109,"w":20,"h":5},"lines":[{"wmode":0,"bbox":{"x":222,"y":109,"w":6,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":222,"y":113,"text":"Nes"},{"wmode":0,"bbox":{"x":229,"y":109,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":229,"y":113,"text":"t"},{"wmode":0,"bbox":{"x":230,"y":109,"w":7,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":230,"y":113,"text":"ed T"},{"wmode":0,"bbox":{"x":238,"y":109,"w":1,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":238,"y":113,"text":"r"},{"wmode":0,"bbox":{"x":239,"y":109,"w":4,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":239,"y":113,"text":"ee"}]},{"type":"text","bbox":{"x":224,"y":170,"w":18,"h":5},"lines":[{"wmode":0,"bbox":{"x":224,"y":170,"w":15,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":224,"y":174,"text":"Exit Guar"},{"wmode":0,"bbox":{"x":240,"y":170,"w":2,"h":5},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":240,"y":174,"text":"d"}]},{"type":"text","bbox":{"x":131,"y":197,"w":79,"h":9},"lines":[{"wmode":0,"bbox":{"x":131,"y":199,"w":7,"h":7},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":6},"x":131,"y":205,"text":"(a)"},{"wmode":0,"bbox":{"x":203,"y":197,"w":7,"h":7},"font":{"name":"XMYAFE+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":6},"x":203,"y":203,"text":"(b)"}]},{"type":"text","bbox":{"x":54,"y":223,"w":239,"h":50},"lines":[{"wmode":0,"bbox":{"x":54,"y":223,"w":34,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":232,"text":"Figure 7."},{"wmode":0,"bbox":{"x":88,"y":223,"w":204,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":88,"y":232,"text":" Control flow graph of a nested loop with an if statement"},{"wmode":0,"bbox":{"x":54,"y":233,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":242,"text":"inside the inner most loop (a). An inner tree captures the inner"},{"wmode":0,"bbox":{"x":54,"y":243,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":251,"text":"loop, and is nested inside an outer tree which “calls” the inner tree."},{"wmode":0,"bbox":{"x":54,"y":253,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":261,"text":"The inner tree returns to the outer tree once it exits along its loop"},{"wmode":0,"bbox":{"x":54,"y":263,"w":71,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":271,"text":"condition guard (b)."}]},{"type":"text","bbox":{"x":54,"y":292,"w":239,"h":61},"lines":[{"wmode":0,"bbox":{"x":54,"y":292,"w":135,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":300,"text":"In general, if loops are nested to depth"},{"wmode":0,"bbox":{"x":189,"y":293,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":189,"y":300,"text":" k"},{"wmode":0,"bbox":{"x":196,"y":292,"w":67,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":196,"y":300,"text":", and each loop has"},{"wmode":0,"bbox":{"x":264,"y":293,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":264,"y":300,"text":" n"},{"wmode":0,"bbox":{"x":272,"y":292,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":272,"y":300,"text":" paths"},{"wmode":0,"bbox":{"x":54,"y":302,"w":184,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":310,"text":"(on geometric average), this na¨ıve strategy yields"},{"wmode":0,"bbox":{"x":238,"y":304,"w":10,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":238,"y":310,"text":" O"},{"wmode":0,"bbox":{"x":249,"y":304,"w":3,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":249,"y":310,"text":"("},{"wmode":0,"bbox":{"x":252,"y":304,"w":5,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":252,"y":310,"text":"n"},{"wmode":0,"bbox":{"x":258,"y":302,"w":3,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":258,"y":307,"text":"k"},{"wmode":0,"bbox":{"x":262,"y":304,"w":3,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":262,"y":310,"text":")"},{"wmode":0,"bbox":{"x":266,"y":302,"w":26,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":266,"y":310,"text":" traces,"},{"wmode":0,"bbox":{"x":54,"y":312,"w":129,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":320,"text":"which can easily fill the trace cache."},{"wmode":0,"bbox":{"x":65,"y":322,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":330,"text":"In order to execute programs with nested loops efficiently, a"},{"wmode":0,"bbox":{"x":54,"y":332,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":340,"text":"tracing system needs a technique for covering the nested loops with"},{"wmode":0,"bbox":{"x":54,"y":342,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":350,"text":"native code without exponential trace duplication."}]},{"type":"text","bbox":{"x":54,"y":360,"w":91,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":360,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":369,"text":"4.1"},{"wmode":0,"bbox":{"x":74,"y":360,"w":70,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":369,"text":"Nesting Algorithm"}]},{"type":"text","bbox":{"x":54,"y":374,"w":239,"h":181},"lines":[{"wmode":0,"bbox":{"x":54,"y":374,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":383,"text":"The key insight is that if each loop is represented by its own trace"},{"wmode":0,"bbox":{"x":54,"y":384,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":393,"text":"tree, the code for each loop can be contained only in its own tree,"},{"wmode":0,"bbox":{"x":54,"y":394,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":403,"text":"and outer loop paths will not be duplicated. Another key fact is that"},{"wmode":0,"bbox":{"x":54,"y":404,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":413,"text":"we are not tracing arbitrary bytecodes that might have irreduceable"},{"wmode":0,"bbox":{"x":54,"y":414,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":422,"text":"control flow graphs, but rather bytecodes produced by a compiler"},{"wmode":0,"bbox":{"x":54,"y":424,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":432,"text":"for a language with structured control flow. Thus, given two loop"},{"wmode":0,"bbox":{"x":54,"y":434,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":442,"text":"edges, the system can easily determine whether they are nested"},{"wmode":0,"bbox":{"x":54,"y":444,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":452,"text":"and which is the inner loop. Using this knowledge, the system can"},{"wmode":0,"bbox":{"x":54,"y":454,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":462,"text":"compile inner and outer loops separately, and make the outer loop’s"},{"wmode":0,"bbox":{"x":54,"y":464,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":472,"text":"traces"},{"wmode":0,"bbox":{"x":74,"y":464,"w":15,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":74,"y":472,"text":" call"},{"wmode":0,"bbox":{"x":90,"y":464,"w":95,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":90,"y":472,"text":" the inner loop’s trace tree."},{"wmode":0,"bbox":{"x":65,"y":474,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":482,"text":"The algorithm for building nested trace trees is as follows. We"},{"wmode":0,"bbox":{"x":54,"y":484,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":492,"text":"start tracing at loop headers exactly as in the basic tracing system."},{"wmode":0,"bbox":{"x":54,"y":494,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":502,"text":"When we exit a loop (detected by comparing the interpreter PC"},{"wmode":0,"bbox":{"x":54,"y":504,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":512,"text":"with the range given by the loop edge), we stop the trace. The"},{"wmode":0,"bbox":{"x":54,"y":514,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":522,"text":"key step of the algorithm occurs when we are recording a trace"},{"wmode":0,"bbox":{"x":54,"y":524,"w":29,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":532,"text":"for loop"},{"wmode":0,"bbox":{"x":83,"y":525,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":83,"y":532,"text":" L"},{"wmode":0,"bbox":{"x":92,"y":529,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":92,"y":533,"text":"R"},{"wmode":0,"bbox":{"x":97,"y":524,"w":6,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":97,"y":533,"text":" ("},{"wmode":0,"bbox":{"x":103,"y":525,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":103,"y":532,"text":"R"},{"wmode":0,"bbox":{"x":110,"y":524,"w":182,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":110,"y":532,"text":" for loop being recorded) and we reach the header"},{"wmode":0,"bbox":{"x":54,"y":534,"w":64,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":542,"text":"of a different loop"},{"wmode":0,"bbox":{"x":118,"y":535,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":118,"y":542,"text":" L"},{"wmode":0,"bbox":{"x":127,"y":539,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":127,"y":543,"text":"O"},{"wmode":0,"bbox":{"x":132,"y":534,"w":5,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":132,"y":543,"text":" ("},{"wmode":0,"bbox":{"x":138,"y":535,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":138,"y":542,"text":"O"},{"wmode":0,"bbox":{"x":145,"y":534,"w":92,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":145,"y":542,"text":" for other loop). Note that"},{"wmode":0,"bbox":{"x":237,"y":535,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":237,"y":542,"text":" L"},{"wmode":0,"bbox":{"x":245,"y":539,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":245,"y":543,"text":"O"},{"wmode":0,"bbox":{"x":251,"y":534,"w":41,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":543,"text":" must be an"},{"wmode":0,"bbox":{"x":54,"y":544,"w":46,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":552,"text":"inner loop of"},{"wmode":0,"bbox":{"x":100,"y":545,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":100,"y":552,"text":" L"},{"wmode":0,"bbox":{"x":108,"y":549,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":108,"y":553,"text":"R"},{"wmode":0,"bbox":{"x":114,"y":544,"w":170,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":114,"y":553,"text":" because we stop the trace when we exit a loop."}]},{"type":"text","bbox":{"x":59,"y":558,"w":233,"h":41},"lines":[{"wmode":0,"bbox":{"x":59,"y":560,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":566,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":558,"w":9,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":566,"text":" If"},{"wmode":0,"bbox":{"x":72,"y":560,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":72,"y":567,"text":" L"},{"wmode":0,"bbox":{"x":81,"y":564,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":81,"y":568,"text":"O"},{"wmode":0,"bbox":{"x":87,"y":559,"w":180,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":87,"y":568,"text":" has a type-matching compiled trace tree, we call"},{"wmode":0,"bbox":{"x":267,"y":560,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":267,"y":567,"text":" L"},{"wmode":0,"bbox":{"x":276,"y":564,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":276,"y":568,"text":"O"},{"wmode":0,"bbox":{"x":282,"y":559,"w":10,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":282,"y":568,"text":" as"},{"wmode":0,"bbox":{"x":66,"y":569,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":577,"text":"a nested trace tree. If the call succeeds, then we record the call"},{"wmode":0,"bbox":{"x":66,"y":579,"w":52,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":587,"text":"in the trace for"},{"wmode":0,"bbox":{"x":119,"y":580,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":119,"y":587,"text":" L"},{"wmode":0,"bbox":{"x":128,"y":584,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":128,"y":588,"text":"R"},{"wmode":0,"bbox":{"x":134,"y":579,"w":127,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":134,"y":587,"text":". On future executions, the trace for"},{"wmode":0,"bbox":{"x":262,"y":580,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":262,"y":587,"text":" L"},{"wmode":0,"bbox":{"x":270,"y":584,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":270,"y":588,"text":"R"},{"wmode":0,"bbox":{"x":276,"y":579,"w":16,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":276,"y":588,"text":" will"},{"wmode":0,"bbox":{"x":66,"y":589,"w":97,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":597,"text":"call the inner trace directly."}]},{"type":"text","bbox":{"x":59,"y":602,"w":233,"h":51},"lines":[{"wmode":0,"bbox":{"x":59,"y":604,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":610,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":602,"w":9,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":610,"text":" If"},{"wmode":0,"bbox":{"x":72,"y":604,"w":9,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":72,"y":611,"text":" L"},{"wmode":0,"bbox":{"x":82,"y":608,"w":5,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":82,"y":612,"text":"O"},{"wmode":0,"bbox":{"x":87,"y":603,"w":205,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":87,"y":612,"text":" does not have a type-matching compiled trace tree yet,"},{"wmode":0,"bbox":{"x":66,"y":613,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":621,"text":"we have to obtain it before we are able to proceed. In order"},{"wmode":0,"bbox":{"x":66,"y":623,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":631,"text":"to do this, we simply abort recording the first trace. The trace"},{"wmode":0,"bbox":{"x":66,"y":633,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":641,"text":"monitor will see the inner loop header, and will immediately"},{"wmode":0,"bbox":{"x":66,"y":643,"w":106,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":651,"text":"start recording the inner loop."},{"wmode":0,"bbox":{"x":173,"y":642,"w":5,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":5},"x":173,"y":651,"text":" 2"}]},{"type":"text","bbox":{"x":54,"y":658,"w":239,"h":20},"lines":[{"wmode":0,"bbox":{"x":65,"y":658,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":666,"text":"If all the loops in a nest are type-stable, then loop nesting creates"},{"wmode":0,"bbox":{"x":54,"y":668,"w":196,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":676,"text":"no duplication. Otherwise, if loops are nested to a depth"},{"wmode":0,"bbox":{"x":250,"y":670,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":250,"y":676,"text":" k"},{"wmode":0,"bbox":{"x":257,"y":668,"w":35,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":257,"y":676,"text":", and each"}]},{"type":"text","bbox":{"x":54,"y":686,"w":239,"h":39},"lines":[{"wmode":0,"bbox":{"x":54,"y":688,"w":2,"h":7},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":5},"x":54,"y":693,"text":"2"},{"wmode":0,"bbox":{"x":56,"y":686,"w":236,"h":12},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":56,"y":693,"text":" Instead of aborting the outer recording, we could principally merely sus-"},{"wmode":0,"bbox":{"x":54,"y":698,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":54,"y":705,"text":"pend the recording, but that would require the implementation to be able"},{"wmode":0,"bbox":{"x":54,"y":707,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":54,"y":714,"text":"to record several traces simultaneously, complicating the implementation,"},{"wmode":0,"bbox":{"x":54,"y":716,"w":164,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":54,"y":723,"text":"while saving only a few iterations in the interpreter."}]},{"type":"text","bbox":{"x":398,"y":100,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":398,"y":100,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":398,"y":105,"text":"i"},{"wmode":0,"bbox":{"x":399,"y":102,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":399,"y":105,"text":"2"}]},{"type":"text","bbox":{"x":398,"y":120,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":398,"y":120,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":398,"y":124,"text":"i"},{"wmode":0,"bbox":{"x":399,"y":121,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":399,"y":124,"text":"3"}]},{"type":"text","bbox":{"x":398,"y":79,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":398,"y":79,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":398,"y":84,"text":"i"},{"wmode":0,"bbox":{"x":399,"y":80,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":399,"y":84,"text":"1"}]},{"type":"text","bbox":{"x":398,"y":179,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":398,"y":179,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":398,"y":184,"text":"i"},{"wmode":0,"bbox":{"x":399,"y":181,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":399,"y":184,"text":"6"}]},{"type":"text","bbox":{"x":398,"y":141,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":398,"y":141,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":398,"y":146,"text":"i"},{"wmode":0,"bbox":{"x":399,"y":142,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":399,"y":146,"text":"4"}]},{"type":"text","bbox":{"x":398,"y":161,"w":2,"h":5},"lines":[{"wmode":0,"bbox":{"x":398,"y":161,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":398,"y":165,"text":"i"},{"wmode":0,"bbox":{"x":399,"y":162,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":399,"y":165,"text":"5"}]},{"type":"text","bbox":{"x":447,"y":100,"w":3,"h":5},"lines":[{"wmode":0,"bbox":{"x":447,"y":100,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":447,"y":105,"text":"t"},{"wmode":0,"bbox":{"x":449,"y":101,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":449,"y":105,"text":"2"}]},{"type":"text","bbox":{"x":430,"y":78,"w":3,"h":5},"lines":[{"wmode":0,"bbox":{"x":430,"y":78,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":430,"y":82,"text":"t"},{"wmode":0,"bbox":{"x":431,"y":79,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":431,"y":82,"text":"1"}]},{"type":"text","bbox":{"x":447,"y":143,"w":3,"h":5},"lines":[{"wmode":0,"bbox":{"x":447,"y":143,"w":1,"h":5},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":4},"x":447,"y":148,"text":"t"},{"wmode":0,"bbox":{"x":449,"y":144,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":449,"y":148,"text":"4"}]},{"type":"text","bbox":{"x":463,"y":135,"w":17,"h":4},"lines":[{"wmode":0,"bbox":{"x":463,"y":135,"w":15,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":463,"y":139,"text":"Exit Guar"},{"wmode":0,"bbox":{"x":478,"y":135,"w":2,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":478,"y":139,"text":"d"}]},{"type":"text","bbox":{"x":459,"y":85,"w":19,"h":4},"lines":[{"wmode":0,"bbox":{"x":459,"y":85,"w":6,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":459,"y":89,"text":"Nes"},{"wmode":0,"bbox":{"x":465,"y":85,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":465,"y":89,"text":"t"},{"wmode":0,"bbox":{"x":466,"y":85,"w":6,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":466,"y":89,"text":"ed T"},{"wmode":0,"bbox":{"x":473,"y":85,"w":1,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":473,"y":89,"text":"r"},{"wmode":0,"bbox":{"x":475,"y":85,"w":3,"h":4},"font":{"name":"BLSTWU+Calibri-Bold","family":"serif","weight":"bold","style":"normal","size":3},"x":475,"y":89,"text":"ee"}]},{"type":"text","bbox":{"x":317,"y":204,"w":239,"h":41},"lines":[{"wmode":0,"bbox":{"x":317,"y":204,"w":33,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":213,"text":"Figure 8."},{"wmode":0,"bbox":{"x":350,"y":204,"w":205,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":350,"y":213,"text":" Control flow graph of a loop with two nested loops (left)"},{"wmode":0,"bbox":{"x":317,"y":214,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":223,"text":"and its nested trace tree configuration (right). The outer tree calls"},{"wmode":0,"bbox":{"x":317,"y":224,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":233,"text":"the two inner nested trace trees and places guards at their side exit"},{"wmode":0,"bbox":{"x":317,"y":234,"w":34,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":243,"text":"locations."}]},{"type":"text","bbox":{"x":317,"y":268,"w":239,"h":200},"lines":[{"wmode":0,"bbox":{"x":317,"y":268,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":276,"text":"loop is entered with"},{"wmode":0,"bbox":{"x":387,"y":269,"w":10,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":387,"y":276,"text":" m"},{"wmode":0,"bbox":{"x":397,"y":268,"w":158,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":397,"y":276,"text":" different type maps (on geometric average),"},{"wmode":0,"bbox":{"x":317,"y":278,"w":59,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":286,"text":"then we compile"},{"wmode":0,"bbox":{"x":376,"y":280,"w":9,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":376,"y":286,"text":" O"},{"wmode":0,"bbox":{"x":386,"y":280,"w":3,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":386,"y":286,"text":"("},{"wmode":0,"bbox":{"x":390,"y":280,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":390,"y":286,"text":"m"},{"wmode":0,"bbox":{"x":398,"y":278,"w":3,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":398,"y":283,"text":"k"},{"wmode":0,"bbox":{"x":403,"y":280,"w":3,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":403,"y":286,"text":")"},{"wmode":0,"bbox":{"x":406,"y":278,"w":149,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":406,"y":286,"text":" copies of the innermost loop. As long as"},{"wmode":0,"bbox":{"x":317,"y":290,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":317,"y":296,"text":"m"},{"wmode":0,"bbox":{"x":325,"y":288,"w":194,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":325,"y":296,"text":" is close to 1, the resulting trace trees will be tractable."},{"wmode":0,"bbox":{"x":328,"y":298,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":306,"text":"An important detail is that the call to the inner trace tree must act"},{"wmode":0,"bbox":{"x":317,"y":308,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":316,"text":"like a function call site: it must return to the same point every time."},{"wmode":0,"bbox":{"x":317,"y":318,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":326,"text":"The goal of nesting is to make inner and outer loops independent;"},{"wmode":0,"bbox":{"x":317,"y":328,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":336,"text":"thus when the inner tree is called, it must exit to the same point"},{"wmode":0,"bbox":{"x":317,"y":338,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":346,"text":"in the outer tree every time with the same type map. Because we"},{"wmode":0,"bbox":{"x":317,"y":348,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":356,"text":"cannot actually guarantee this property, we must guard on it after"},{"wmode":0,"bbox":{"x":317,"y":358,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":366,"text":"the call, and side exit if the property does not hold. A common"},{"wmode":0,"bbox":{"x":317,"y":368,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":376,"text":"reason for the inner tree not to return to the same point would"},{"wmode":0,"bbox":{"x":317,"y":378,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":386,"text":"be if the inner tree took a new side exit for which it had never"},{"wmode":0,"bbox":{"x":317,"y":388,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":396,"text":"compiled a trace. At this point, the interpreter PC is in the inner"},{"wmode":0,"bbox":{"x":317,"y":398,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":406,"text":"tree, so we cannot continue recording or executing the outer tree."},{"wmode":0,"bbox":{"x":317,"y":408,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":416,"text":"If this happens during recording, we abort the outer trace, to give"},{"wmode":0,"bbox":{"x":317,"y":418,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":426,"text":"the inner tree a chance to finish growing. A future execution of the"},{"wmode":0,"bbox":{"x":317,"y":428,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":436,"text":"outer tree would then be able to properly finish and record a call to"},{"wmode":0,"bbox":{"x":317,"y":438,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":446,"text":"the inner tree. If an inner tree side exit happens during execution of"},{"wmode":0,"bbox":{"x":317,"y":448,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":456,"text":"a compiled trace for the outer tree, we simply exit the outer trace"},{"wmode":0,"bbox":{"x":317,"y":457,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":466,"text":"and start recording a new branch in the inner tree."}]},{"type":"text","bbox":{"x":317,"y":479,"w":115,"h":11},"lines":[{"wmode":0,"bbox":{"x":317,"y":479,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":487,"text":"4.2"},{"wmode":0,"bbox":{"x":337,"y":479,"w":95,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":337,"y":487,"text":"Blacklisting with Nesting"}]},{"type":"text","bbox":{"x":317,"y":493,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":317,"y":493,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":501,"text":"The blacklisting algorithm needs modification to work well with"},{"wmode":0,"bbox":{"x":317,"y":503,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":511,"text":"nesting. The problem is that outer loop traces often abort during"},{"wmode":0,"bbox":{"x":317,"y":513,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":521,"text":"startup (because the inner tree is not available or takes a side exit),"},{"wmode":0,"bbox":{"x":317,"y":523,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":531,"text":"which would lead to their being quickly blacklisted by the basic"},{"wmode":0,"bbox":{"x":317,"y":533,"w":37,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":541,"text":"algorithm."},{"wmode":0,"bbox":{"x":328,"y":543,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":551,"text":"The key observation is that when an outer trace aborts because"},{"wmode":0,"bbox":{"x":317,"y":553,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":561,"text":"the inner tree is not ready, this is probably a temporary condition."},{"wmode":0,"bbox":{"x":317,"y":563,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":571,"text":"Thus, we should not count such aborts toward blacklisting as long"},{"wmode":0,"bbox":{"x":317,"y":573,"w":199,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":581,"text":"as we are able to build up more traces for the inner tree."},{"wmode":0,"bbox":{"x":328,"y":583,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":591,"text":"In our implementation, when an outer tree aborts on the inner"},{"wmode":0,"bbox":{"x":317,"y":593,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":601,"text":"tree, we increment the outer tree’s blacklist counter as usual and"},{"wmode":0,"bbox":{"x":317,"y":603,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":611,"text":"back off on compiling it. When the inner tree finishes a trace, we"},{"wmode":0,"bbox":{"x":317,"y":613,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":621,"text":"decrement the blacklist counter on the outer loop, “forgiving” the"},{"wmode":0,"bbox":{"x":317,"y":623,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":631,"text":"outer loop for aborting previously. We also undo the backoff so that"},{"wmode":0,"bbox":{"x":317,"y":633,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":641,"text":"the outer tree can start immediately trying to compile the next time"},{"wmode":0,"bbox":{"x":317,"y":642,"w":41,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":651,"text":"we reach it."}]},{"type":"text","bbox":{"x":317,"y":669,"w":134,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":669,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":679,"text":"5."},{"wmode":0,"bbox":{"x":336,"y":669,"w":115,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":336,"y":679,"text":"Trace Tree Optimization"}]},{"type":"text","bbox":{"x":317,"y":685,"w":239,"h":40},"lines":[{"wmode":0,"bbox":{"x":317,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":693,"text":"This section explains how a recorded trace is translated to an"},{"wmode":0,"bbox":{"x":317,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"optimized machine code trace. The trace compilation subsystem,"},{"wmode":0,"bbox":{"x":317,"y":706,"w":32,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":713,"text":"NANOJIT"},{"wmode":0,"bbox":{"x":350,"y":705,"w":205,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":350,"y":713,"text":", is separate from the VM and can be used for other"},{"wmode":0,"bbox":{"x":317,"y":715,"w":45,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"applications."}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":74,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":71,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":79,"text":"5.1"},{"wmode":0,"bbox":{"x":74,"y":71,"w":54,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":79,"text":"Optimizations"}]},{"type":"text","bbox":{"x":53,"y":85,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":54,"y":85,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":93,"text":"Because traces are in SSA form and have no join points or"},{"wmode":0,"bbox":{"x":280,"y":87,"w":9,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":280,"y":93,"text":" φ"},{"wmode":0,"bbox":{"x":290,"y":85,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":290,"y":93,"text":"-"},{"wmode":0,"bbox":{"x":53,"y":95,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":103,"text":"nodes, certain optimizations are easy to implement. In order to"},{"wmode":0,"bbox":{"x":53,"y":105,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":113,"text":"get good startup performance, the optimizations must run quickly,"},{"wmode":0,"bbox":{"x":53,"y":115,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":123,"text":"so we chose a small set of optimizations. We implemented the"},{"wmode":0,"bbox":{"x":53,"y":125,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":133,"text":"optimizations as pipelined filters so that they can be turned on and"},{"wmode":0,"bbox":{"x":53,"y":135,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":143,"text":"off independently, and yet all run in just two loop passes over the"},{"wmode":0,"bbox":{"x":53,"y":145,"w":135,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":153,"text":"trace: one forward and one backward."},{"wmode":0,"bbox":{"x":65,"y":155,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":163,"text":"Every time the trace recorder emits a LIR instruction, the in-"},{"wmode":0,"bbox":{"x":53,"y":165,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":173,"text":"struction is immediately passed to the first filter in the forward"},{"wmode":0,"bbox":{"x":53,"y":175,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":183,"text":"pipeline. Thus, forward filter optimizations are performed as the"},{"wmode":0,"bbox":{"x":53,"y":185,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":193,"text":"trace is recorded. Each filter may pass each instruction to the next"},{"wmode":0,"bbox":{"x":53,"y":195,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":203,"text":"filter unchanged, write a different instruction to the next filter, or"},{"wmode":0,"bbox":{"x":53,"y":205,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":213,"text":"write no instruction at all. For example, the constant folding filter"},{"wmode":0,"bbox":{"x":53,"y":215,"w":138,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":223,"text":"can replace a multiply instruction like"},{"wmode":0,"bbox":{"x":192,"y":216,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":192,"y":223,"text":" v"},{"wmode":0,"bbox":{"x":199,"y":219,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":199,"y":224,"text":"13"},{"wmode":0,"bbox":{"x":206,"y":216,"w":13,"h":9},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":206,"y":224,"text":" :="},{"wmode":0,"bbox":{"x":220,"y":216,"w":19,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":220,"y":223,"text":" mul"},{"wmode":0,"bbox":{"x":240,"y":216,"w":4,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":240,"y":223,"text":"3"},{"wmode":0,"bbox":{"x":245,"y":216,"w":2,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":245,"y":223,"text":","},{"wmode":0,"bbox":{"x":247,"y":216,"w":19,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":223,"text":" 1000"},{"wmode":0,"bbox":{"x":267,"y":215,"w":25,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":267,"y":223,"text":" with a"},{"wmode":0,"bbox":{"x":53,"y":225,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":233,"text":"constant instruction"},{"wmode":0,"bbox":{"x":124,"y":226,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":124,"y":233,"text":" v"},{"wmode":0,"bbox":{"x":131,"y":229,"w":7,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":131,"y":234,"text":"13"},{"wmode":0,"bbox":{"x":138,"y":226,"w":31,"h":9},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":138,"y":234,"text":" = 3000"},{"wmode":0,"bbox":{"x":169,"y":225,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":169,"y":233,"text":"."},{"wmode":0,"bbox":{"x":65,"y":235,"w":141,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":243,"text":"We currently apply four forward filters:"}]},{"type":"text","bbox":{"x":59,"y":251,"w":233,"h":31},"lines":[{"wmode":0,"bbox":{"x":59,"y":253,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":259,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":251,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":259,"text":" On ISAs without floating-point instructions, a soft-float filter"},{"wmode":0,"bbox":{"x":66,"y":262,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":270,"text":"converts floating-point LIR instructions to sequences of integer"},{"wmode":0,"bbox":{"x":66,"y":272,"w":44,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":280,"text":"instructions."}]},{"type":"text","bbox":{"x":59,"y":285,"w":160,"h":15},"lines":[{"wmode":0,"bbox":{"x":59,"y":287,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":293,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":285,"w":156,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":293,"text":" CSE (constant subexpression elimination),"}]},{"type":"text","bbox":{"x":59,"y":299,"w":233,"h":27},"lines":[{"wmode":0,"bbox":{"x":59,"y":301,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":307,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":299,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":307,"text":" expression simplification, including constant folding and a few"},{"wmode":0,"bbox":{"x":66,"y":310,"w":88,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":318,"text":"algebraic identities (e.g.,"},{"wmode":0,"bbox":{"x":155,"y":311,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":155,"y":318,"text":" a"},{"wmode":0,"bbox":{"x":162,"y":311,"w":9,"h":15},"font":{"name":"NXYQZX+CMSY9","family":"serif","weight":"normal","style":"italic","size":8},"x":162,"y":318,"text":" −"},{"wmode":0,"bbox":{"x":171,"y":311,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":171,"y":318,"text":" a"},{"wmode":0,"bbox":{"x":178,"y":311,"w":16,"h":8},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":178,"y":318,"text":" = 0"},{"wmode":0,"bbox":{"x":195,"y":310,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":195,"y":318,"text":"), and"}]},{"type":"text","bbox":{"x":59,"y":323,"w":233,"h":41},"lines":[{"wmode":0,"bbox":{"x":59,"y":325,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":331,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":323,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":331,"text":" source language semantic-specific expression simplification,"},{"wmode":0,"bbox":{"x":66,"y":334,"w":140,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":342,"text":"primarily algebraic identities that allow"},{"wmode":0,"bbox":{"x":207,"y":335,"w":33,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":207,"y":342,"text":" DOUBLE"},{"wmode":0,"bbox":{"x":240,"y":334,"w":52,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":240,"y":342,"text":" to be replaced"},{"wmode":0,"bbox":{"x":66,"y":344,"w":15,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":352,"text":"with"},{"wmode":0,"bbox":{"x":82,"y":345,"w":15,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":82,"y":352,"text":" INT"},{"wmode":0,"bbox":{"x":98,"y":344,"w":128,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":98,"y":352,"text":". For example, LIR that converts an"},{"wmode":0,"bbox":{"x":227,"y":345,"w":15,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":227,"y":352,"text":" INT"},{"wmode":0,"bbox":{"x":242,"y":344,"w":16,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":242,"y":352,"text":" to a"},{"wmode":0,"bbox":{"x":258,"y":345,"w":34,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":258,"y":352,"text":" DOUBLE"},{"wmode":0,"bbox":{"x":66,"y":354,"w":187,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":362,"text":"and then back again would be removed by this filter."}]},{"type":"text","bbox":{"x":53,"y":371,"w":239,"h":60},"lines":[{"wmode":0,"bbox":{"x":65,"y":371,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":379,"text":"When trace recording is completed, nanojit runs the backward"},{"wmode":0,"bbox":{"x":53,"y":381,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":389,"text":"optimization filters. These are used for optimizations that require"},{"wmode":0,"bbox":{"x":53,"y":391,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":399,"text":"backward program analysis. When running the backward filters,"},{"wmode":0,"bbox":{"x":53,"y":401,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":409,"text":"nanojit reads one LIR instruction at a time, and the reads are passed"},{"wmode":0,"bbox":{"x":53,"y":411,"w":74,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":419,"text":"through the pipeline."},{"wmode":0,"bbox":{"x":65,"y":421,"w":150,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":429,"text":"We currently apply three backward filters:"}]},{"type":"text","bbox":{"x":59,"y":437,"w":233,"h":61},"lines":[{"wmode":0,"bbox":{"x":59,"y":439,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":445,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":437,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":445,"text":" Dead data-stack store elimination. The LIR trace encodes many"},{"wmode":0,"bbox":{"x":66,"y":448,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":456,"text":"stores to locations in the interpreter stack. But these values are"},{"wmode":0,"bbox":{"x":66,"y":458,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":466,"text":"never read back before exiting the trace (by the interpreter or"},{"wmode":0,"bbox":{"x":66,"y":468,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":476,"text":"another trace). Thus, stores to the stack that are overwritten"},{"wmode":0,"bbox":{"x":66,"y":478,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":486,"text":"before the next exit are dead. Stores to locations that are off"},{"wmode":0,"bbox":{"x":66,"y":488,"w":210,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":496,"text":"the top of the interpreter stack at future exits are also dead."}]},{"type":"text","bbox":{"x":59,"y":501,"w":233,"h":31},"lines":[{"wmode":0,"bbox":{"x":59,"y":503,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":509,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":501,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":509,"text":" Dead call-stack store elimination. This is the same optimization"},{"wmode":0,"bbox":{"x":66,"y":512,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":520,"text":"as above, except applied to the interpreter’s call stack used for"},{"wmode":0,"bbox":{"x":66,"y":522,"w":77,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":530,"text":"function call inlining."}]},{"type":"text","bbox":{"x":59,"y":535,"w":233,"h":21},"lines":[{"wmode":0,"bbox":{"x":59,"y":537,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":543,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":535,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":543,"text":" Dead code elimination. This eliminates any operation that"},{"wmode":0,"bbox":{"x":66,"y":546,"w":124,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":554,"text":"stores to a value that is never used."}]},{"type":"text","bbox":{"x":53,"y":563,"w":239,"h":30},"lines":[{"wmode":0,"bbox":{"x":65,"y":563,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":571,"text":"After a LIR instruction is successfully read (“pulled”) from"},{"wmode":0,"bbox":{"x":53,"y":573,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":581,"text":"the backward filter pipeline, nanojit’s code generator emits native"},{"wmode":0,"bbox":{"x":53,"y":583,"w":102,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":591,"text":"machine instruction(s) for it."}]},{"type":"text","bbox":{"x":53,"y":601,"w":93,"h":11},"lines":[{"wmode":0,"bbox":{"x":53,"y":601,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":53,"y":609,"text":"5.2"},{"wmode":0,"bbox":{"x":74,"y":601,"w":73,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":609,"text":"Register Allocation"}]},{"type":"text","bbox":{"x":53,"y":615,"w":239,"h":110},"lines":[{"wmode":0,"bbox":{"x":53,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":623,"text":"We use a simple greedy register allocator that makes a single"},{"wmode":0,"bbox":{"x":53,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":633,"text":"backward pass over the trace (it is integrated with the code gen-"},{"wmode":0,"bbox":{"x":53,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":643,"text":"erator). By the time the allocator has reached an instruction like"},{"wmode":0,"bbox":{"x":53,"y":647,"w":4,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":53,"y":653,"text":"v"},{"wmode":0,"bbox":{"x":58,"y":650,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":58,"y":654,"text":"3"},{"wmode":0,"bbox":{"x":62,"y":647,"w":10,"h":9},"font":{"name":"RYTUZQ+CMR9","family":"serif","weight":"normal","style":"normal","size":8},"x":62,"y":654,"text":" ="},{"wmode":0,"bbox":{"x":72,"y":647,"w":24,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":72,"y":653,"text":" add v"},{"wmode":0,"bbox":{"x":96,"y":650,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":96,"y":654,"text":"1"},{"wmode":0,"bbox":{"x":101,"y":647,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":101,"y":653,"text":", v"},{"wmode":0,"bbox":{"x":109,"y":650,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":109,"y":654,"text":"2"},{"wmode":0,"bbox":{"x":113,"y":645,"w":131,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":113,"y":653,"text":", it has already assigned a register to"},{"wmode":0,"bbox":{"x":244,"y":647,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":244,"y":653,"text":" v"},{"wmode":0,"bbox":{"x":251,"y":650,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":251,"y":654,"text":"3"},{"wmode":0,"bbox":{"x":256,"y":645,"w":10,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":256,"y":653,"text":". If"},{"wmode":0,"bbox":{"x":266,"y":647,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":266,"y":653,"text":" v"},{"wmode":0,"bbox":{"x":273,"y":650,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":273,"y":654,"text":"1"},{"wmode":0,"bbox":{"x":277,"y":645,"w":15,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":277,"y":654,"text":" and"},{"wmode":0,"bbox":{"x":53,"y":657,"w":4,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":53,"y":663,"text":"v"},{"wmode":0,"bbox":{"x":58,"y":660,"w":3,"h":5},"font":{"name":"ACEGLD+CMR6","family":"serif","weight":"normal","style":"normal","size":5},"x":58,"y":664,"text":"2"},{"wmode":0,"bbox":{"x":62,"y":655,"w":230,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":62,"y":664,"text":" have not yet been assigned registers, the allocator assigns a free"},{"wmode":0,"bbox":{"x":53,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":673,"text":"register to each. If there are no free registers, a value is selected for"},{"wmode":0,"bbox":{"x":53,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":683,"text":"spilling. We use a class heuristic that selects the “oldest” register-"},{"wmode":0,"bbox":{"x":53,"y":685,"w":61,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":693,"text":"carried value (6)."},{"wmode":0,"bbox":{"x":65,"y":695,"w":108,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":703,"text":"The heuristic considers the set"},{"wmode":0,"bbox":{"x":174,"y":696,"w":9,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":174,"y":703,"text":" R"},{"wmode":0,"bbox":{"x":183,"y":695,"w":34,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":183,"y":703,"text":" of values"},{"wmode":0,"bbox":{"x":218,"y":696,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":218,"y":703,"text":" v"},{"wmode":0,"bbox":{"x":225,"y":695,"w":67,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":225,"y":703,"text":" in registers imme-"},{"wmode":0,"bbox":{"x":53,"y":705,"w":185,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":713,"text":"diately after the current instruction for spilling. Let"},{"wmode":0,"bbox":{"x":239,"y":706,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":239,"y":713,"text":" v"},{"wmode":0,"bbox":{"x":246,"y":710,"w":6,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":246,"y":714,"text":"m"},{"wmode":0,"bbox":{"x":252,"y":705,"w":40,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":252,"y":714,"text":" be the last"},{"wmode":0,"bbox":{"x":53,"y":715,"w":147,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":723,"text":"instruction before the current where each"},{"wmode":0,"bbox":{"x":201,"y":716,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":201,"y":723,"text":" v"},{"wmode":0,"bbox":{"x":208,"y":715,"w":84,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":208,"y":723,"text":" is referred to. Then the"}]},{"type":"text","bbox":{"x":323,"y":70,"w":114,"h":10},"lines":[{"wmode":0,"bbox":{"x":323,"y":70,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":323,"y":78,"text":"Tag"},{"wmode":0,"bbox":{"x":348,"y":70,"w":28,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":78,"text":"JS Type"},{"wmode":0,"bbox":{"x":396,"y":70,"w":41,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":78,"text":"Description"}]},{"type":"text","bbox":{"x":323,"y":81,"w":226,"h":50},"lines":[{"wmode":0,"bbox":{"x":323,"y":81,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":323,"y":89,"text":"xx1"},{"wmode":0,"bbox":{"x":348,"y":81,"w":27,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":89,"text":"number"},{"wmode":0,"bbox":{"x":396,"y":81,"w":101,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":89,"text":"31-bit integer representation"},{"wmode":0,"bbox":{"x":323,"y":91,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":323,"y":99,"text":"000"},{"wmode":0,"bbox":{"x":348,"y":91,"w":21,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":99,"text":"object"},{"wmode":0,"bbox":{"x":396,"y":91,"w":95,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":99,"text":"pointer to JSObject handle"},{"wmode":0,"bbox":{"x":323,"y":100,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":323,"y":109,"text":"010"},{"wmode":0,"bbox":{"x":348,"y":100,"w":27,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":109,"text":"number"},{"wmode":0,"bbox":{"x":396,"y":100,"w":87,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":109,"text":"pointer to double handle"},{"wmode":0,"bbox":{"x":323,"y":110,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":323,"y":119,"text":"100"},{"wmode":0,"bbox":{"x":348,"y":110,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":119,"text":"string"},{"wmode":0,"bbox":{"x":396,"y":110,"w":93,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":119,"text":"pointer to JSString handle"},{"wmode":0,"bbox":{"x":323,"y":120,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":323,"y":129,"text":"110"},{"wmode":0,"bbox":{"x":348,"y":120,"w":28,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":129,"text":"boolean"},{"wmode":0,"bbox":{"x":396,"y":120,"w":153,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":129,"text":"enumeration for null, undefined, true, false"}]},{"type":"text","bbox":{"x":348,"y":130,"w":35,"h":20},"lines":[{"wmode":0,"bbox":{"x":348,"y":130,"w":25,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":139,"text":"null, or"},{"wmode":0,"bbox":{"x":348,"y":140,"w":35,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":348,"y":149,"text":"undefined"}]},{"type":"text","bbox":{"x":317,"y":157,"w":239,"h":41},"lines":[{"wmode":0,"bbox":{"x":317,"y":157,"w":239,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":166,"text":"Figure 9. Tagged values in the SpiderMonkey JS interpreter."},{"wmode":0,"bbox":{"x":317,"y":168,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":176,"text":"Testing tags, unboxing (extracting the untagged value) and boxing"},{"wmode":0,"bbox":{"x":317,"y":178,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":186,"text":"(creating tagged values) are significant costs. Avoiding these costs"},{"wmode":0,"bbox":{"x":317,"y":188,"w":92,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":196,"text":"is a key benefit of tracing."}]},{"type":"text","bbox":{"x":317,"y":225,"w":239,"h":80},"lines":[{"wmode":0,"bbox":{"x":317,"y":225,"w":57,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":233,"text":"heuristic selects"},{"wmode":0,"bbox":{"x":374,"y":226,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":374,"y":233,"text":" v"},{"wmode":0,"bbox":{"x":382,"y":225,"w":57,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":382,"y":233,"text":" with minimum"},{"wmode":0,"bbox":{"x":439,"y":226,"w":7,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":439,"y":233,"text":" v"},{"wmode":0,"bbox":{"x":446,"y":230,"w":6,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":446,"y":234,"text":"m"},{"wmode":0,"bbox":{"x":454,"y":225,"w":102,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":454,"y":233,"text":". The motivation is that this"},{"wmode":0,"bbox":{"x":317,"y":235,"w":217,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":243,"text":"frees up a register for as long as possible given a single spill."},{"wmode":0,"bbox":{"x":328,"y":245,"w":101,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":253,"text":"If we need to spill a value"},{"wmode":0,"bbox":{"x":430,"y":246,"w":8,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":430,"y":253,"text":" v"},{"wmode":0,"bbox":{"x":438,"y":249,"w":3,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":438,"y":254,"text":"s"},{"wmode":0,"bbox":{"x":441,"y":245,"w":114,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":441,"y":254,"text":" at this point, we generate the"},{"wmode":0,"bbox":{"x":317,"y":255,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":263,"text":"restore code just after the code for the current instruction. The"},{"wmode":0,"bbox":{"x":317,"y":265,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":273,"text":"corresponding spill code is generated just after the last point where"},{"wmode":0,"bbox":{"x":317,"y":276,"w":4,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":317,"y":283,"text":"v"},{"wmode":0,"bbox":{"x":321,"y":279,"w":3,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":321,"y":284,"text":"s"},{"wmode":0,"bbox":{"x":324,"y":275,"w":155,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":324,"y":284,"text":" was used. The register that was assigned to"},{"wmode":0,"bbox":{"x":480,"y":276,"w":6,"h":8},"font":{"name":"AZLOMJ+CMMI9","family":"serif","weight":"normal","style":"italic","size":8},"x":480,"y":283,"text":" v"},{"wmode":0,"bbox":{"x":486,"y":279,"w":3,"h":5},"font":{"name":"LNDLDG+CMMI6","family":"serif","weight":"normal","style":"italic","size":5},"x":486,"y":284,"text":"s"},{"wmode":0,"bbox":{"x":490,"y":275,"w":65,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":490,"y":284,"text":" is marked free for"},{"wmode":0,"bbox":{"x":317,"y":285,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":293,"text":"the preceding code, because that register can now be used freely"},{"wmode":0,"bbox":{"x":317,"y":295,"w":130,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":303,"text":"without affecting the following code"}]},{"type":"text","bbox":{"x":317,"y":317,"w":94,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":317,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":327,"text":"6."},{"wmode":0,"bbox":{"x":336,"y":317,"w":74,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":336,"y":327,"text":"Implementation"}]},{"type":"text","bbox":{"x":317,"y":333,"w":239,"h":229},"lines":[{"wmode":0,"bbox":{"x":317,"y":333,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":341,"text":"To demonstrate the effectiveness of our approach, we have im-"},{"wmode":0,"bbox":{"x":317,"y":343,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":351,"text":"plemented a trace-based dynamic compiler for the SpiderMonkey"},{"wmode":0,"bbox":{"x":317,"y":353,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":361,"text":"JavaScript Virtual Machine (4). SpiderMonkey is the JavaScript"},{"wmode":0,"bbox":{"x":317,"y":363,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":371,"text":"VM embedded in Mozilla’s Firefox open-source web browser (2),"},{"wmode":0,"bbox":{"x":317,"y":373,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":381,"text":"which is used by more than 200 million users world-wide. The core"},{"wmode":0,"bbox":{"x":317,"y":383,"w":230,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":391,"text":"of SpiderMonkey is a bytecode interpreter implemented in C++."},{"wmode":0,"bbox":{"x":328,"y":393,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":401,"text":"In SpiderMonkey, all JavaScript values are represented by the"},{"wmode":0,"bbox":{"x":317,"y":403,"w":15,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":411,"text":"type"},{"wmode":0,"bbox":{"x":332,"y":405,"w":25,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":332,"y":411,"text":" jsval"},{"wmode":0,"bbox":{"x":358,"y":403,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":358,"y":411,"text":". A"},{"wmode":0,"bbox":{"x":369,"y":405,"w":25,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":369,"y":411,"text":" jsval"},{"wmode":0,"bbox":{"x":395,"y":403,"w":160,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":395,"y":411,"text":" is machine word in which up to the 3 of the"},{"wmode":0,"bbox":{"x":317,"y":413,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":421,"text":"least significant bits are a type tag, and the remaining bits are data."},{"wmode":0,"bbox":{"x":317,"y":423,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":431,"text":"See Figure 6 for details. All pointers contained in"},{"wmode":0,"bbox":{"x":495,"y":425,"w":30,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":495,"y":431,"text":" jsvals"},{"wmode":0,"bbox":{"x":525,"y":423,"w":30,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":525,"y":431,"text":" point to"},{"wmode":0,"bbox":{"x":317,"y":433,"w":186,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":441,"text":"GC-controlled blocks aligned on 8-byte boundaries."},{"wmode":0,"bbox":{"x":328,"y":443,"w":36,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":451,"text":"JavaScript"},{"wmode":0,"bbox":{"x":365,"y":443,"w":24,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":365,"y":451,"text":" object"},{"wmode":0,"bbox":{"x":389,"y":443,"w":166,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":389,"y":451,"text":" values are mappings of string-valued property"},{"wmode":0,"bbox":{"x":317,"y":453,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":461,"text":"names to arbitrary values. They are represented in one of two ways"},{"wmode":0,"bbox":{"x":317,"y":463,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":471,"text":"in SpiderMonkey. Most objects are represented by a shared struc-"},{"wmode":0,"bbox":{"x":317,"y":473,"w":96,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":481,"text":"tural description, called the"},{"wmode":0,"bbox":{"x":413,"y":473,"w":46,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":413,"y":481,"text":" object shape"},{"wmode":0,"bbox":{"x":460,"y":473,"w":95,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":460,"y":481,"text":", that maps property names"},{"wmode":0,"bbox":{"x":317,"y":483,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":491,"text":"to array indexes using a hash table. The object stores a pointer to"},{"wmode":0,"bbox":{"x":317,"y":492,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":501,"text":"the shape and the array of its own property values. Objects with"},{"wmode":0,"bbox":{"x":317,"y":502,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":511,"text":"large, unique sets of property names store their properties directly"},{"wmode":0,"bbox":{"x":317,"y":512,"w":53,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":521,"text":"in a hash table."},{"wmode":0,"bbox":{"x":328,"y":522,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":531,"text":"The garbage collector is an exact, non-generational, stop-the-"},{"wmode":0,"bbox":{"x":317,"y":532,"w":118,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":541,"text":"world mark-and-sweep collector."},{"wmode":0,"bbox":{"x":328,"y":542,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":551,"text":"In the rest of this section we discuss key areas of the TraceMon-"},{"wmode":0,"bbox":{"x":317,"y":552,"w":73,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":561,"text":"key implementation."}]},{"type":"text","bbox":{"x":317,"y":571,"w":115,"h":11},"lines":[{"wmode":0,"bbox":{"x":317,"y":571,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":580,"text":"6.1"},{"wmode":0,"bbox":{"x":337,"y":571,"w":94,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":337,"y":580,"text":"Calling Compiled Traces"}]},{"type":"text","bbox":{"x":317,"y":585,"w":239,"h":140},"lines":[{"wmode":0,"bbox":{"x":317,"y":585,"w":113,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":594,"text":"Compiled traces are stored in a"},{"wmode":0,"bbox":{"x":430,"y":585,"w":44,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":430,"y":594,"text":" trace cache"},{"wmode":0,"bbox":{"x":474,"y":585,"w":81,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":474,"y":594,"text":", indexed by intepreter"},{"wmode":0,"bbox":{"x":317,"y":595,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":604,"text":"PC and type map. Traces are compiled so that they may be"},{"wmode":0,"bbox":{"x":317,"y":605,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":613,"text":"called as functions using standard native calling conventions (e.g.,"},{"wmode":0,"bbox":{"x":317,"y":617,"w":37,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"FASTCALL"},{"wmode":0,"bbox":{"x":354,"y":615,"w":32,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":354,"y":623,"text":" on x86)."},{"wmode":0,"bbox":{"x":328,"y":625,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":633,"text":"The interpreter must hit a loop edge and enter the monitor in"},{"wmode":0,"bbox":{"x":317,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"order to call a native trace for the first time. The monitor computes"},{"wmode":0,"bbox":{"x":317,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":653,"text":"the current type map, checks the trace cache for a trace for the"},{"wmode":0,"bbox":{"x":317,"y":655,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"current PC and type map, and if it finds one, executes the trace."},{"wmode":0,"bbox":{"x":328,"y":665,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":673,"text":"To execute a trace, the monitor must build a trace activation"},{"wmode":0,"bbox":{"x":317,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"record containing imported local and global variables, temporary"},{"wmode":0,"bbox":{"x":317,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":693,"text":"stack space, and space for arguments to native calls. The local and"},{"wmode":0,"bbox":{"x":317,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"global values are then copied from the interpreter state to the trace"},{"wmode":0,"bbox":{"x":317,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":713,"text":"activation record. Then, the trace is called like a normal C function"},{"wmode":0,"bbox":{"x":317,"y":715,"w":27,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"pointer."}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":239,"h":150},"lines":[{"wmode":0,"bbox":{"x":65,"y":71,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":79,"text":"When a trace call returns, the monitor restores the interpreter"},{"wmode":0,"bbox":{"x":54,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":89,"text":"state. First, the monitor checks the reason for the trace exit and"},{"wmode":0,"bbox":{"x":54,"y":91,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":99,"text":"applies blacklisting if needed. Then, it pops or synthesizes inter-"},{"wmode":0,"bbox":{"x":54,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":109,"text":"preter JavaScript call stack frames as needed. Finally, it copies the"},{"wmode":0,"bbox":{"x":54,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":119,"text":"imported variables back from the trace activation record to the in-"},{"wmode":0,"bbox":{"x":54,"y":121,"w":51,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":129,"text":"terpreter state."},{"wmode":0,"bbox":{"x":65,"y":131,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":139,"text":"At least in the current implementation, these steps have a non-"},{"wmode":0,"bbox":{"x":54,"y":141,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":149,"text":"negligible runtime cost, so minimizing the number of interpreter-"},{"wmode":0,"bbox":{"x":54,"y":151,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":159,"text":"to-trace and trace-to-interpreter transitions is essential for perfor-"},{"wmode":0,"bbox":{"x":54,"y":161,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":169,"text":"mance. (see also Section 3.3). Our experiments (see Figure 12)"},{"wmode":0,"bbox":{"x":54,"y":171,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":179,"text":"show that for programs we can trace well such transitions hap-"},{"wmode":0,"bbox":{"x":54,"y":181,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":189,"text":"pen infrequently and hence do not contribute significantly to total"},{"wmode":0,"bbox":{"x":54,"y":191,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":199,"text":"runtime. In a few programs, where the system is prevented from"},{"wmode":0,"bbox":{"x":54,"y":201,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":209,"text":"recording branch traces for hot side exits by aborts, this cost can"},{"wmode":0,"bbox":{"x":54,"y":211,"w":146,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":219,"text":"rise to up to 10% of total execution time."}]},{"type":"text","bbox":{"x":54,"y":229,"w":78,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":229,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":238,"text":"6.2"},{"wmode":0,"bbox":{"x":74,"y":229,"w":58,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":238,"text":"Trace Stitching"}]},{"type":"text","bbox":{"x":53,"y":244,"w":239,"h":289},"lines":[{"wmode":0,"bbox":{"x":54,"y":244,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":252,"text":"Transitions from a trace to a branch trace at a side exit avoid the"},{"wmode":0,"bbox":{"x":54,"y":254,"w":217,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":262,"text":"costs of calling traces from the monitor, in a feature called"},{"wmode":0,"bbox":{"x":271,"y":254,"w":21,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":271,"y":262,"text":" trace"},{"wmode":0,"bbox":{"x":54,"y":263,"w":30,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":54,"y":272,"text":"stitching"},{"wmode":0,"bbox":{"x":84,"y":263,"w":208,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":84,"y":272,"text":". At a side exit, the exiting trace only needs to write live"},{"wmode":0,"bbox":{"x":53,"y":273,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":282,"text":"register-carried values back to its trace activation record. In our im-"},{"wmode":0,"bbox":{"x":53,"y":283,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":292,"text":"plementation, identical type maps yield identical activation record"},{"wmode":0,"bbox":{"x":53,"y":293,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":302,"text":"layouts, so the trace activation record can be reused immediately"},{"wmode":0,"bbox":{"x":53,"y":303,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":312,"text":"by the branch trace."},{"wmode":0,"bbox":{"x":65,"y":313,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":322,"text":"In programs with branchy trace trees with small traces, trace"},{"wmode":0,"bbox":{"x":54,"y":323,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":332,"text":"stitching has a noticeable cost. Although writing to memory and"},{"wmode":0,"bbox":{"x":54,"y":333,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":341,"text":"then soon reading back would be expected to have a high L1"},{"wmode":0,"bbox":{"x":54,"y":343,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":351,"text":"cache hit rate, for small traces the increased instruction count has"},{"wmode":0,"bbox":{"x":54,"y":353,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":361,"text":"a noticeable cost. Also, if the writes and reads are very close"},{"wmode":0,"bbox":{"x":54,"y":363,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":371,"text":"in the dynamic instruction stream, we have found that current"},{"wmode":0,"bbox":{"x":54,"y":373,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":381,"text":"x86 processors often incur penalties of 6 cycles or more (e.g., if"},{"wmode":0,"bbox":{"x":54,"y":383,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":391,"text":"the instructions use different base registers with equal values, the"},{"wmode":0,"bbox":{"x":54,"y":393,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":401,"text":"processor may not be able to detect that the addresses are the same"},{"wmode":0,"bbox":{"x":54,"y":403,"w":43,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":411,"text":"right away)."},{"wmode":0,"bbox":{"x":65,"y":413,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":421,"text":"The alternate solution is to recompile an entire trace tree, thus"},{"wmode":0,"bbox":{"x":54,"y":423,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":431,"text":"achieving inter-trace register allocation (10). The disadvantage is"},{"wmode":0,"bbox":{"x":54,"y":433,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":441,"text":"that tree recompilation takes time quadratic in the number of traces."},{"wmode":0,"bbox":{"x":54,"y":443,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":451,"text":"We believe that the cost of recompiling a trace tree every time"},{"wmode":0,"bbox":{"x":54,"y":453,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":461,"text":"a branch is added would be prohibitive. That problem might be"},{"wmode":0,"bbox":{"x":54,"y":463,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":471,"text":"mitigated by recompiling only at certain points, or only for very"},{"wmode":0,"bbox":{"x":54,"y":473,"w":58,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":481,"text":"hot, stable trees."},{"wmode":0,"bbox":{"x":65,"y":483,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":491,"text":"In the future, multicore hardware is expected to be common,"},{"wmode":0,"bbox":{"x":54,"y":493,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":501,"text":"making background tree recompilation attractive. In a closely re-"},{"wmode":0,"bbox":{"x":54,"y":503,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":511,"text":"lated project (13) background recompilation yielded speedups of"},{"wmode":0,"bbox":{"x":54,"y":513,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":521,"text":"up to 1.25x on benchmarks with many branch traces. We plan to"},{"wmode":0,"bbox":{"x":54,"y":522,"w":189,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":531,"text":"apply this technique to TraceMonkey as future work."}]},{"type":"text","bbox":{"x":54,"y":541,"w":84,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":541,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":550,"text":"6.3"},{"wmode":0,"bbox":{"x":74,"y":541,"w":63,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":550,"text":"Trace Recording"}]},{"type":"text","bbox":{"x":54,"y":555,"w":239,"h":170},"lines":[{"wmode":0,"bbox":{"x":54,"y":555,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":564,"text":"The job of the trace recorder is to emit LIR with identical semantics"},{"wmode":0,"bbox":{"x":54,"y":565,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":574,"text":"to the currently running interpreter bytecode trace. A good imple-"},{"wmode":0,"bbox":{"x":54,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":584,"text":"mentation should have low impact on non-tracing interpreter per-"},{"wmode":0,"bbox":{"x":54,"y":585,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":594,"text":"formance and a convenient way for implementers to maintain se-"},{"wmode":0,"bbox":{"x":54,"y":595,"w":71,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":604,"text":"mantic equivalence."},{"wmode":0,"bbox":{"x":65,"y":605,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":613,"text":"In our implementation, the only direct modification to the inter-"},{"wmode":0,"bbox":{"x":54,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":623,"text":"preter is a call to the trace monitor at loop edges. In our benchmark"},{"wmode":0,"bbox":{"x":54,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":633,"text":"results (see Figure 12) the total time spent in the monitor (for all"},{"wmode":0,"bbox":{"x":54,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":643,"text":"activities) is usually less than 5%, so we consider the interpreter"},{"wmode":0,"bbox":{"x":54,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":653,"text":"impact requirement met. Incrementing the loop hit counter is ex-"},{"wmode":0,"bbox":{"x":54,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":663,"text":"pensive because it requires us to look up the loop in the trace cache,"},{"wmode":0,"bbox":{"x":54,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":673,"text":"but we have tuned our loops to become hot and trace very quickly"},{"wmode":0,"bbox":{"x":54,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":683,"text":"(on the second iteration). The hit counter implementation could be"},{"wmode":0,"bbox":{"x":54,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":693,"text":"improved, which might give us a small increase in overall perfor-"},{"wmode":0,"bbox":{"x":54,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":703,"text":"mance, as well as more flexibility with tuning hotness thresholds."},{"wmode":0,"bbox":{"x":54,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":713,"text":"Once a loop is blacklisted we never call into the trace monitor for"},{"wmode":0,"bbox":{"x":54,"y":715,"w":96,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":723,"text":"that loop (see Section 3.3)."}]},{"type":"text","bbox":{"x":317,"y":71,"w":239,"h":459},"lines":[{"wmode":0,"bbox":{"x":328,"y":71,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":79,"text":"Recording is activated by a pointer swap that sets the inter-"},{"wmode":0,"bbox":{"x":317,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":89,"text":"preter’s dispatch table to call a single “interrupt” routine for ev-"},{"wmode":0,"bbox":{"x":317,"y":91,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":99,"text":"ery bytecode. The interrupt routine first calls a bytecode-specific"},{"wmode":0,"bbox":{"x":317,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":109,"text":"recording routine. Then, it turns off recording if necessary (e.g.,"},{"wmode":0,"bbox":{"x":317,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":119,"text":"the trace ended). Finally, it jumps to the standard interpreter byte-"},{"wmode":0,"bbox":{"x":317,"y":121,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":129,"text":"code implementation. Some bytecodes have effects on the type map"},{"wmode":0,"bbox":{"x":317,"y":131,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":139,"text":"that cannot be predicted before executing the bytecode (e.g., call-"},{"wmode":0,"bbox":{"x":317,"y":141,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":149,"text":"ing"},{"wmode":0,"bbox":{"x":328,"y":143,"w":82,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":328,"y":149,"text":" String.charCodeAt"},{"wmode":0,"bbox":{"x":411,"y":141,"w":103,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":411,"y":149,"text":", which returns an integer or"},{"wmode":0,"bbox":{"x":514,"y":141,"w":19,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":514,"y":149,"text":" NaN"},{"wmode":0,"bbox":{"x":533,"y":141,"w":22,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":533,"y":149,"text":" if the"},{"wmode":0,"bbox":{"x":317,"y":151,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":159,"text":"index argument is out of range). For these, we arrange for the inter-"},{"wmode":0,"bbox":{"x":317,"y":161,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":169,"text":"preter to call into the recorder again after executing the bytecode."},{"wmode":0,"bbox":{"x":317,"y":171,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":179,"text":"Since such hooks are relatively rare, we embed them directly into"},{"wmode":0,"bbox":{"x":317,"y":181,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":189,"text":"the interpreter, with an additional runtime check to see whether a"},{"wmode":0,"bbox":{"x":317,"y":191,"w":98,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":199,"text":"recorder is currently active."},{"wmode":0,"bbox":{"x":328,"y":201,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":209,"text":"While separating the interpreter from the recorder reduces indi-"},{"wmode":0,"bbox":{"x":317,"y":211,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":219,"text":"vidual code complexity, it also requires careful implementation and"},{"wmode":0,"bbox":{"x":317,"y":221,"w":178,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":229,"text":"extensive testing to achieve semantic equivalence."},{"wmode":0,"bbox":{"x":328,"y":231,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":239,"text":"In some cases achieving this equivalence is difficult since Spi-"},{"wmode":0,"bbox":{"x":317,"y":241,"w":77,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":249,"text":"derMonkey follows a"},{"wmode":0,"bbox":{"x":394,"y":241,"w":47,"h":10},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":8},"x":394,"y":249,"text":" fat-bytecode"},{"wmode":0,"bbox":{"x":441,"y":241,"w":114,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":441,"y":249,"text":" design, which was found to be"},{"wmode":0,"bbox":{"x":317,"y":251,"w":151,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":259,"text":"beneficial to pure interpreter performance."},{"wmode":0,"bbox":{"x":328,"y":260,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":269,"text":"In fat-bytecode designs, individual bytecodes can implement"},{"wmode":0,"bbox":{"x":317,"y":270,"w":110,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":279,"text":"complex processing (e.g., the"},{"wmode":0,"bbox":{"x":427,"y":272,"w":36,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":427,"y":279,"text":" getprop"},{"wmode":0,"bbox":{"x":464,"y":270,"w":91,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":464,"y":279,"text":" bytecode, which imple-"},{"wmode":0,"bbox":{"x":317,"y":280,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":289,"text":"ments full JavaScript property value access, including special cases"},{"wmode":0,"bbox":{"x":317,"y":290,"w":126,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":299,"text":"for cached and dense array access)."},{"wmode":0,"bbox":{"x":328,"y":300,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":309,"text":"Fat bytecodes have two advantages: fewer bytecodes means"},{"wmode":0,"bbox":{"x":317,"y":310,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":319,"text":"lower dispatch cost, and bigger bytecode implementations give the"},{"wmode":0,"bbox":{"x":317,"y":320,"w":199,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":329,"text":"compiler more opportunities to optimize the interpreter."},{"wmode":0,"bbox":{"x":328,"y":330,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":338,"text":"Fat bytecodes are a problem for TraceMonkey because they"},{"wmode":0,"bbox":{"x":317,"y":340,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":348,"text":"require the recorder to reimplement the same special case logic"},{"wmode":0,"bbox":{"x":317,"y":350,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":358,"text":"in the same way. Also, the advantages are reduced because (a)"},{"wmode":0,"bbox":{"x":317,"y":360,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":368,"text":"dispatch costs are eliminated entirely in compiled traces, (b) the"},{"wmode":0,"bbox":{"x":317,"y":370,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":378,"text":"traces contain only one special case, not the interpreter’s large"},{"wmode":0,"bbox":{"x":317,"y":380,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":388,"text":"chunk of code, and (c) TraceMonkey spends less time running the"},{"wmode":0,"bbox":{"x":317,"y":390,"w":57,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":398,"text":"base interpreter."},{"wmode":0,"bbox":{"x":328,"y":400,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":408,"text":"One way we have mitigated these problems is by implementing"},{"wmode":0,"bbox":{"x":317,"y":410,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":418,"text":"certain complex bytecodes in the recorder as sequences of simple"},{"wmode":0,"bbox":{"x":317,"y":420,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":428,"text":"bytecodes. Expressing the original semantics this way is not too dif-"},{"wmode":0,"bbox":{"x":317,"y":430,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":438,"text":"ficult, and recording simple bytecodes is much easier. This enables"},{"wmode":0,"bbox":{"x":317,"y":440,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":448,"text":"us to retain the advantages of fat bytecodes while avoiding some of"},{"wmode":0,"bbox":{"x":317,"y":450,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":458,"text":"their problems for trace recording. This is particularly effective for"},{"wmode":0,"bbox":{"x":317,"y":460,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":468,"text":"fat bytecodes that recurse back into the interpreter, for example to"},{"wmode":0,"bbox":{"x":317,"y":470,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":478,"text":"convert an object into a primitive value by invoking a well-known"},{"wmode":0,"bbox":{"x":317,"y":480,"w":217,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":488,"text":"method on the object, since it lets us inline this function call."},{"wmode":0,"bbox":{"x":328,"y":490,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":498,"text":"It is important to note that we split fat opcodes into thinner op-"},{"wmode":0,"bbox":{"x":317,"y":500,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":508,"text":"codes only during recording. When running purely interpretatively"},{"wmode":0,"bbox":{"x":317,"y":510,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":518,"text":"(i.e. code that has been blacklisted), the interpreter directly and ef-"},{"wmode":0,"bbox":{"x":317,"y":520,"w":120,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":528,"text":"ficiently executes the fat opcodes."}]},{"type":"text","bbox":{"x":317,"y":551,"w":64,"h":11},"lines":[{"wmode":0,"bbox":{"x":317,"y":551,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":560,"text":"6.4"},{"wmode":0,"bbox":{"x":337,"y":551,"w":44,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":337,"y":560,"text":"Preemption"}]},{"type":"text","bbox":{"x":317,"y":565,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":317,"y":565,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":574,"text":"SpiderMonkey, like many VMs, needs to preempt the user program"},{"wmode":0,"bbox":{"x":317,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":584,"text":"periodically. The main reasons are to prevent infinitely looping"},{"wmode":0,"bbox":{"x":317,"y":585,"w":215,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":594,"text":"scripts from locking up the host system and to schedule GC."},{"wmode":0,"bbox":{"x":328,"y":595,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":604,"text":"In the interpreter, this had been implemented by setting a “pre-"},{"wmode":0,"bbox":{"x":317,"y":605,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":613,"text":"empt now” flag that was checked on every backward jump. This"},{"wmode":0,"bbox":{"x":317,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"strategy carried over into TraceMonkey: the VM inserts a guard on"},{"wmode":0,"bbox":{"x":317,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"the preemption flag at every loop edge. We measured less than a"},{"wmode":0,"bbox":{"x":317,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"1% increase in runtime on most benchmarks for this extra guard."},{"wmode":0,"bbox":{"x":317,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":653,"text":"In practice, the cost is detectable only for programs with very short"},{"wmode":0,"bbox":{"x":317,"y":655,"w":21,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"loops."},{"wmode":0,"bbox":{"x":328,"y":665,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":673,"text":"We tested and rejected a solution that avoided the guards by"},{"wmode":0,"bbox":{"x":317,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"compiling the loop edge as an unconditional jump, and patching"},{"wmode":0,"bbox":{"x":317,"y":685,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":693,"text":"the jump target to an exit routine when preemption is required."},{"wmode":0,"bbox":{"x":317,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"This solution can make the normal case slightly faster, but then"},{"wmode":0,"bbox":{"x":317,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":713,"text":"preemption becomes very slow. The implementation was also very"},{"wmode":0,"bbox":{"x":317,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"complex, especially trying to restart execution after the preemption."}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":123,"h":11},"lines":[{"wmode":0,"bbox":{"x":54,"y":71,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":79,"text":"6.5"},{"wmode":0,"bbox":{"x":74,"y":71,"w":103,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":79,"text":"Calling External Functions"}]},{"type":"text","bbox":{"x":53,"y":85,"w":239,"h":528},"lines":[{"wmode":0,"bbox":{"x":54,"y":85,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":93,"text":"Like most interpreters, SpiderMonkey has a foreign function inter-"},{"wmode":0,"bbox":{"x":54,"y":95,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":103,"text":"face (FFI) that allows it to call C builtins and host system functions"},{"wmode":0,"bbox":{"x":54,"y":105,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":113,"text":"(e.g., web browser control and DOM access). The FFI has a stan-"},{"wmode":0,"bbox":{"x":54,"y":115,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":123,"text":"dard signature for JS-callable functions, the key argument of which"},{"wmode":0,"bbox":{"x":54,"y":125,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":133,"text":"is an array of boxed values. External functions called through the"},{"wmode":0,"bbox":{"x":54,"y":135,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":143,"text":"FFI interact with the program state through an interpreter API (e.g.,"},{"wmode":0,"bbox":{"x":54,"y":145,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":153,"text":"to read a property from an argument). There are also certain inter-"},{"wmode":0,"bbox":{"x":54,"y":155,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":163,"text":"preter builtins that do not use the FFI, but interact with the program"},{"wmode":0,"bbox":{"x":54,"y":165,"w":127,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":173,"text":"state in the same way, such as the"},{"wmode":0,"bbox":{"x":181,"y":167,"w":78,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":181,"y":173,"text":" CallIteratorNext"},{"wmode":0,"bbox":{"x":259,"y":165,"w":33,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":259,"y":173,"text":" function"},{"wmode":0,"bbox":{"x":53,"y":175,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":183,"text":"used with iterator objects. TraceMonkey must support this FFI in"},{"wmode":0,"bbox":{"x":53,"y":185,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":193,"text":"order to speed up code that interacts with the host system inside hot"},{"wmode":0,"bbox":{"x":53,"y":195,"w":21,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":203,"text":"loops."},{"wmode":0,"bbox":{"x":65,"y":205,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":213,"text":"Calling external functions from TraceMonkey is potentially dif-"},{"wmode":0,"bbox":{"x":53,"y":215,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":223,"text":"ficult because traces do not update the interpreter state until exit-"},{"wmode":0,"bbox":{"x":53,"y":225,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":233,"text":"ing. In particular, external functions may need the call stack or the"},{"wmode":0,"bbox":{"x":53,"y":235,"w":161,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":243,"text":"global variables, but they may be out of date."},{"wmode":0,"bbox":{"x":65,"y":245,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":253,"text":"For the out-of-date call stack problem, we refactored some of"},{"wmode":0,"bbox":{"x":53,"y":254,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":263,"text":"the interpreter API implementation functions to re-materialize the"},{"wmode":0,"bbox":{"x":53,"y":264,"w":117,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":273,"text":"interpreter call stack on demand."},{"wmode":0,"bbox":{"x":65,"y":274,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":283,"text":"We developed a C++ static analysis and annotated some inter-"},{"wmode":0,"bbox":{"x":53,"y":284,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":293,"text":"preter functions in order to verify that the call stack is refreshed"},{"wmode":0,"bbox":{"x":53,"y":294,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":303,"text":"at any point it needs to be used. In order to access the call stack,"},{"wmode":0,"bbox":{"x":53,"y":304,"w":157,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":313,"text":"a function must be annotated as either F"},{"wmode":0,"bbox":{"x":211,"y":306,"w":24,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":211,"y":313,"text":"ORCES"},{"wmode":0,"bbox":{"x":236,"y":304,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":236,"y":313,"text":"S"},{"wmode":0,"bbox":{"x":242,"y":306,"w":19,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":242,"y":313,"text":"TACK"},{"wmode":0,"bbox":{"x":262,"y":304,"w":22,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":262,"y":313,"text":" or R"},{"wmode":0,"bbox":{"x":285,"y":306,"w":4,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":285,"y":313,"text":"E"},{"wmode":0,"bbox":{"x":289,"y":304,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":289,"y":313,"text":"-"},{"wmode":0,"bbox":{"x":54,"y":316,"w":28,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":54,"y":323,"text":"QUIRES"},{"wmode":0,"bbox":{"x":82,"y":314,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":82,"y":323,"text":"S"},{"wmode":0,"bbox":{"x":88,"y":316,"w":19,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":88,"y":323,"text":"TACK"},{"wmode":0,"bbox":{"x":108,"y":314,"w":184,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":108,"y":323,"text":". These annotations are also required in order to call"},{"wmode":0,"bbox":{"x":54,"y":324,"w":5,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":333,"text":"R"},{"wmode":0,"bbox":{"x":60,"y":326,"w":32,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":60,"y":333,"text":"EQUIRES"},{"wmode":0,"bbox":{"x":93,"y":324,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":93,"y":333,"text":"S"},{"wmode":0,"bbox":{"x":99,"y":326,"w":19,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":99,"y":333,"text":"TACK"},{"wmode":0,"bbox":{"x":119,"y":324,"w":173,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":119,"y":333,"text":" functions, which are presumed to access the call"},{"wmode":0,"bbox":{"x":53,"y":334,"w":71,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":342,"text":"stack transitively. F"},{"wmode":0,"bbox":{"x":125,"y":336,"w":24,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":125,"y":342,"text":"ORCES"},{"wmode":0,"bbox":{"x":151,"y":334,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":151,"y":342,"text":"S"},{"wmode":0,"bbox":{"x":156,"y":336,"w":19,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":156,"y":342,"text":"TACK"},{"wmode":0,"bbox":{"x":176,"y":334,"w":116,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":176,"y":342,"text":" is a trusted annotation, applied"},{"wmode":0,"bbox":{"x":53,"y":344,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":352,"text":"to only 5 functions, that means the function refreshes the call stack."},{"wmode":0,"bbox":{"x":54,"y":354,"w":5,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":362,"text":"R"},{"wmode":0,"bbox":{"x":60,"y":356,"w":32,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":60,"y":362,"text":"EQUIRES"},{"wmode":0,"bbox":{"x":93,"y":354,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":93,"y":362,"text":"S"},{"wmode":0,"bbox":{"x":99,"y":356,"w":19,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":99,"y":362,"text":"TACK"},{"wmode":0,"bbox":{"x":119,"y":354,"w":173,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":119,"y":362,"text":" is an untrusted annotation that means the func-"},{"wmode":0,"bbox":{"x":53,"y":364,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":372,"text":"tion may only be called if the call stack has already been refreshed."},{"wmode":0,"bbox":{"x":65,"y":374,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":382,"text":"Similarly, we detect when host functions attempt to directly"},{"wmode":0,"bbox":{"x":53,"y":384,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":392,"text":"read or write global variables, and force the currently running trace"},{"wmode":0,"bbox":{"x":53,"y":394,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":402,"text":"to side exit. This is necessary since we cache and unbox global"},{"wmode":0,"bbox":{"x":53,"y":404,"w":208,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":412,"text":"variables into the activation record during trace execution."},{"wmode":0,"bbox":{"x":65,"y":414,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":422,"text":"Since both call-stack access and global variable access are"},{"wmode":0,"bbox":{"x":53,"y":424,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":432,"text":"rarely performed by host functions, performance is not significantly"},{"wmode":0,"bbox":{"x":53,"y":434,"w":132,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":442,"text":"affected by these safety mechanisms."},{"wmode":0,"bbox":{"x":65,"y":444,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":452,"text":"Another problem is that external functions can reenter the inter-"},{"wmode":0,"bbox":{"x":53,"y":454,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":462,"text":"preter by calling scripts, which in turn again might want to access"},{"wmode":0,"bbox":{"x":53,"y":464,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":472,"text":"the call stack or global variables. To address this problem, we made"},{"wmode":0,"bbox":{"x":53,"y":474,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":482,"text":"the VM set a flag whenever the interpreter is reentered while a com-"},{"wmode":0,"bbox":{"x":53,"y":484,"w":78,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":492,"text":"piled trace is running."},{"wmode":0,"bbox":{"x":65,"y":494,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":502,"text":"Every call to an external function then checks this flag and exits"},{"wmode":0,"bbox":{"x":53,"y":504,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":512,"text":"the trace immediately after returning from the external function call"},{"wmode":0,"bbox":{"x":53,"y":514,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":522,"text":"if it is set. There are many external functions that seldom or never"},{"wmode":0,"bbox":{"x":53,"y":523,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":532,"text":"reenter, and they can be called without problem, and will cause"},{"wmode":0,"bbox":{"x":53,"y":533,"w":97,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":542,"text":"trace exit only if necessary."},{"wmode":0,"bbox":{"x":65,"y":543,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":552,"text":"The FFI’s boxed value array requirement has a performance"},{"wmode":0,"bbox":{"x":53,"y":553,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":562,"text":"cost, so we defined a new FFI that allows C functions to be an-"},{"wmode":0,"bbox":{"x":53,"y":563,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":572,"text":"notated with their argument types so that the tracer can call them"},{"wmode":0,"bbox":{"x":53,"y":573,"w":187,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":582,"text":"directly, without unnecessary argument conversions."},{"wmode":0,"bbox":{"x":65,"y":583,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":592,"text":"Currently, we do not support calling native property get and set"},{"wmode":0,"bbox":{"x":53,"y":593,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":602,"text":"override functions or DOM functions directly from trace. Support"},{"wmode":0,"bbox":{"x":53,"y":603,"w":83,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":611,"text":"is planned future work."}]},{"type":"text","bbox":{"x":53,"y":621,"w":65,"h":11},"lines":[{"wmode":0,"bbox":{"x":53,"y":621,"w":11,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":53,"y":629,"text":"6.6"},{"wmode":0,"bbox":{"x":74,"y":621,"w":45,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":74,"y":629,"text":"Correctness"}]},{"type":"text","bbox":{"x":53,"y":635,"w":239,"h":90},"lines":[{"wmode":0,"bbox":{"x":53,"y":635,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":643,"text":"During development, we had access to existing JavaScript test"},{"wmode":0,"bbox":{"x":53,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":653,"text":"suites, but most of them were not designed with tracing VMs in"},{"wmode":0,"bbox":{"x":53,"y":655,"w":110,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":663,"text":"mind and contained few loops."},{"wmode":0,"bbox":{"x":65,"y":665,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":673,"text":"One tool that helped us greatly was Mozilla’s JavaScript fuzz"},{"wmode":0,"bbox":{"x":53,"y":675,"w":21,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":683,"text":"tester,"},{"wmode":0,"bbox":{"x":75,"y":677,"w":45,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":75,"y":683,"text":" JSFUNFUZZ"},{"wmode":0,"bbox":{"x":121,"y":675,"w":171,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":121,"y":683,"text":", which generates random JavaScript programs"},{"wmode":0,"bbox":{"x":53,"y":685,"w":192,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":693,"text":"by nesting random language elements. We modified"},{"wmode":0,"bbox":{"x":246,"y":687,"w":46,"h":8},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":246,"y":693,"text":" JSFUNFUZZ"},{"wmode":0,"bbox":{"x":53,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":703,"text":"to generate loops, and also to test more heavily certain constructs"},{"wmode":0,"bbox":{"x":53,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":713,"text":"we suspected would reveal flaws in our implementation. For exam-"},{"wmode":0,"bbox":{"x":53,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":723,"text":"ple, we suspected bugs in TraceMonkey’s handling of type-unstable"}]},{"type":"text","bbox":{"x":377,"y":254,"w":182,"h":6},"lines":[{"wmode":0,"bbox":{"x":377,"y":254,"w":7,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":377,"y":259,"text":"!\"#"},{"wmode":0,"bbox":{"x":393,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":393,"y":259,"text":"$!\"#"},{"wmode":0,"bbox":{"x":410,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":410,"y":259,"text":"%!\"#"},{"wmode":0,"bbox":{"x":427,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":427,"y":259,"text":"&!\"#"},{"wmode":0,"bbox":{"x":444,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":444,"y":259,"text":"'!\"#"},{"wmode":0,"bbox":{"x":461,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":461,"y":259,"text":"(!\"#"},{"wmode":0,"bbox":{"x":478,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":478,"y":259,"text":")!\"#"},{"wmode":0,"bbox":{"x":496,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":496,"y":259,"text":"*!\"#"},{"wmode":0,"bbox":{"x":513,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":513,"y":259,"text":"+!\"#"},{"wmode":0,"bbox":{"x":530,"y":254,"w":10,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":530,"y":259,"text":",!\"#"},{"wmode":0,"bbox":{"x":546,"y":254,"w":13,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":546,"y":259,"text":"$!!\"#"}]},{"type":"text","bbox":{"x":350,"y":243,"w":26,"h":5},"lines":[{"wmode":0,"bbox":{"x":350,"y":243,"w":26,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":350,"y":247,"text":"&-./012#3%4%56#"}]},{"type":"text","bbox":{"x":346,"y":236,"w":30,"h":5},"lines":[{"wmode":0,"bbox":{"x":346,"y":236,"w":30,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":346,"y":240,"text":"&-.789:;#3%4,56#"}]},{"type":"text","bbox":{"x":344,"y":230,"w":32,"h":5},"lines":[{"wmode":0,"bbox":{"x":344,"y":230,"w":32,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":344,"y":234,"text":"&-.9<=>9</2#3$4%56#"}]},{"type":"text","bbox":{"x":330,"y":223,"w":46,"h":5},"lines":[{"wmode":0,"bbox":{"x":330,"y":223,"w":46,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":330,"y":227,"text":"<//2??.1@A<9=.>922?#3!4,56#"}]},{"type":"text","bbox":{"x":335,"y":216,"w":41,"h":5},"lines":[{"wmode":0,"bbox":{"x":335,"y":216,"w":41,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":335,"y":221,"text":"<//2??.B<AAC0/;#3%4%56#"}]},{"type":"text","bbox":{"x":340,"y":203,"w":36,"h":11},"lines":[{"wmode":0,"bbox":{"x":340,"y":210,"w":36,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":340,"y":214,"text":"<//2??.A18-=#3'4%56#"},{"wmode":0,"bbox":{"x":340,"y":203,"w":36,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":340,"y":207,"text":"<//2??.A?@2D2#3&4!56#"}]},{"type":"text","bbox":{"x":321,"y":197,"w":55,"h":5},"lines":[{"wmode":0,"bbox":{"x":321,"y":197,"w":55,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":321,"y":201,"text":"1@>8:?.&1@>.1@>?.@A.1=>2#3%(4(56#"}]},{"type":"text","bbox":{"x":331,"y":190,"w":45,"h":5},"lines":[{"wmode":0,"bbox":{"x":331,"y":190,"w":45,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":331,"y":194,"text":"1@>8:?.1@>?.@A.1=>2#3+4*56#"}]},{"type":"text","bbox":{"x":329,"y":184,"w":47,"h":5},"lines":[{"wmode":0,"bbox":{"x":329,"y":184,"w":47,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":329,"y":188,"text":"1@>8:?.1@>E@?2.<A-#3%(4%56#"}]},{"type":"text","bbox":{"x":333,"y":177,"w":43,"h":5},"lines":[{"wmode":0,"bbox":{"x":333,"y":177,"w":43,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":333,"y":181,"text":"1@>8:?.A?@2D2.1@>?#3%4*56#"}]},{"type":"text","bbox":{"x":326,"y":170,"w":50,"h":5},"lines":[{"wmode":0,"bbox":{"x":326,"y":170,"w":50,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":326,"y":175,"text":"/8A>98FG8E.92/09?@D2#3$4!56#"}]},{"type":"text","bbox":{"x":343,"y":151,"w":33,"h":18},"lines":[{"wmode":0,"bbox":{"x":345,"y":164,"w":30,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":345,"y":168,"text":"/9=:>8.<2?#3$4)56#"},{"wmode":0,"bbox":{"x":343,"y":157,"w":33,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":343,"y":161,"text":"/9=:>8.7-(#3%4&56#"},{"wmode":0,"bbox":{"x":343,"y":151,"w":33,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":343,"y":155,"text":"/9=:>8.?;<$#3(4,56#"}]},{"type":"text","bbox":{"x":331,"y":137,"w":44,"h":11},"lines":[{"wmode":0,"bbox":{"x":333,"y":144,"w":43,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":333,"y":148,"text":"-<>2.B897<>.>8H2#3$4$56#"},{"wmode":0,"bbox":{"x":331,"y":137,"w":44,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":331,"y":142,"text":"-<>2.B897<>.5:<91#3$4!56#"}]},{"type":"text","bbox":{"x":343,"y":131,"w":33,"h":5},"lines":[{"wmode":0,"bbox":{"x":343,"y":131,"w":33,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":343,"y":135,"text":"7<>;./89-@/#3'4,56#"}]},{"type":"text","bbox":{"x":331,"y":124,"w":44,"h":5},"lines":[{"wmode":0,"bbox":{"x":331,"y":124,"w":44,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":331,"y":128,"text":"7<>;.:<9I<F.?07?#3(4,56#"}]},{"type":"text","bbox":{"x":328,"y":118,"w":48,"h":5},"lines":[{"wmode":0,"bbox":{"x":328,"y":118,"w":48,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":328,"y":122,"text":"7<>;.?:2/>9<F.A897#3*4$56#"}]},{"type":"text","bbox":{"x":344,"y":111,"w":32,"h":5},"lines":[{"wmode":0,"bbox":{"x":344,"y":111,"w":32,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":344,"y":115,"text":"92J25:.-A<#3'4%56#"}]},{"type":"text","bbox":{"x":340,"y":104,"w":36,"h":5},"lines":[{"wmode":0,"bbox":{"x":340,"y":104,"w":36,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":340,"y":109,"text":"?>9@AJ.1<?2)'#3%4(56#"}]},{"type":"text","bbox":{"x":344,"y":98,"w":32,"h":5},"lines":[{"wmode":0,"bbox":{"x":344,"y":98,"w":32,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":344,"y":102,"text":"?>9@AJ.B<?><#3$4(56#"}]},{"type":"text","bbox":{"x":337,"y":91,"w":38,"h":5},"lines":[{"wmode":0,"bbox":{"x":337,"y":91,"w":38,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":337,"y":95,"text":"?>9@AJ.><J/F80-#3$4$56#"}]},{"type":"text","bbox":{"x":328,"y":78,"w":48,"h":11},"lines":[{"wmode":0,"bbox":{"x":330,"y":85,"w":46,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":330,"y":89,"text":"?>9@AJ.0A:</C./8-2#3$4%56#"},{"wmode":0,"bbox":{"x":328,"y":78,"w":48,"h":5},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":328,"y":82,"text":"?>9@AJ.D<F@-<>2.@A:0>#3$4,56#"}]},{"type":"text","bbox":{"x":411,"y":271,"w":63,"h":6},"lines":[{"wmode":0,"bbox":{"x":411,"y":271,"w":21,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":411,"y":276,"text":"KA>29:92>#"},{"wmode":0,"bbox":{"x":459,"y":271,"w":15,"h":6},"font":{"name":"BTMOLE+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":459,"y":276,"text":"L<ID2#"}]},{"type":"text","bbox":{"x":317,"y":298,"w":239,"h":80},"lines":[{"wmode":0,"bbox":{"x":317,"y":298,"w":239,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":307,"text":"Figure 11. Fraction of dynamic bytecodes executed by inter-"},{"wmode":0,"bbox":{"x":317,"y":308,"w":105,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":317,"text":"preter and on native traces."},{"wmode":0,"bbox":{"x":422,"y":308,"w":133,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":422,"y":317,"text":" The speedup vs. interpreter is shown"},{"wmode":0,"bbox":{"x":317,"y":318,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":327,"text":"in parentheses next to each test. The fraction of bytecodes exe-"},{"wmode":0,"bbox":{"x":317,"y":328,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":337,"text":"cuted while recording is too small to see in this figure, except"},{"wmode":0,"bbox":{"x":317,"y":338,"w":10,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":347,"text":"for"},{"wmode":0,"bbox":{"x":327,"y":340,"w":49,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":327,"y":347,"text":" crypto-md5"},{"wmode":0,"bbox":{"x":377,"y":338,"w":179,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":377,"y":347,"text":", where fully 3% of bytecodes are executed while"},{"wmode":0,"bbox":{"x":317,"y":348,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":357,"text":"recording. In most of the tests, almost all the bytecodes are exe-"},{"wmode":0,"bbox":{"x":317,"y":358,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":367,"text":"cuted by compiled traces. Three of the benchmarks are not traced"},{"wmode":0,"bbox":{"x":317,"y":368,"w":110,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":377,"text":"at all and run in the interpreter."}]},{"type":"text","bbox":{"x":317,"y":398,"w":239,"h":20},"lines":[{"wmode":0,"bbox":{"x":317,"y":398,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":406,"text":"loops and heavily branching code, and a specialized fuzz tester in-"},{"wmode":0,"bbox":{"x":317,"y":408,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":416,"text":"deed revealed several regressions which we subsequently corrected."}]},{"type":"text","bbox":{"x":317,"y":430,"w":70,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":430,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":440,"text":"7."},{"wmode":0,"bbox":{"x":336,"y":430,"w":51,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":336,"y":440,"text":"Evaluation"}]},{"type":"text","bbox":{"x":317,"y":446,"w":239,"h":279},"lines":[{"wmode":0,"bbox":{"x":317,"y":446,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":454,"text":"We evaluated our JavaScript tracing implementation using Sun-"},{"wmode":0,"bbox":{"x":317,"y":456,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":464,"text":"Spider, the industry standard JavaScript benchmark suite. SunSpi-"},{"wmode":0,"bbox":{"x":317,"y":466,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":474,"text":"der consists of 26 short-running (less than 250ms, average 26ms)"},{"wmode":0,"bbox":{"x":317,"y":476,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":484,"text":"JavaScript programs. This is in stark contrast to benchmark suites"},{"wmode":0,"bbox":{"x":317,"y":486,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":494,"text":"such as SpecJVM98 (3) used to evaluate desktop and server Java"},{"wmode":0,"bbox":{"x":317,"y":496,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":504,"text":"VMs. Many programs in those benchmarks use large data sets and"},{"wmode":0,"bbox":{"x":317,"y":506,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":514,"text":"execute for minutes. The SunSpider programs carry out a variety of"},{"wmode":0,"bbox":{"x":317,"y":516,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":524,"text":"tasks, primarily 3d rendering, bit-bashing, cryptographic encoding,"},{"wmode":0,"bbox":{"x":317,"y":525,"w":128,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":534,"text":"math kernels, and string processing."},{"wmode":0,"bbox":{"x":328,"y":535,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":544,"text":"All experiments were performed on a MacBook Pro with 2.2"},{"wmode":0,"bbox":{"x":317,"y":545,"w":219,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":554,"text":"GHz Core 2 processor and 2 GB RAM running MacOS 10.5."},{"wmode":0,"bbox":{"x":328,"y":555,"w":75,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":564,"text":"Benchmark results."},{"wmode":0,"bbox":{"x":404,"y":555,"w":151,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":404,"y":564,"text":" The main question is whether programs"},{"wmode":0,"bbox":{"x":317,"y":565,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":574,"text":"run faster with tracing. For this, we ran the standard SunSpider test"},{"wmode":0,"bbox":{"x":317,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":584,"text":"driver, which starts a JavaScript interpreter, loads and runs each"},{"wmode":0,"bbox":{"x":317,"y":585,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":594,"text":"program once for warmup, then loads and runs each program 10"},{"wmode":0,"bbox":{"x":317,"y":595,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":604,"text":"times and reports the average time taken by each. We ran 4 differ-"},{"wmode":0,"bbox":{"x":317,"y":605,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":613,"text":"ent configurations for comparison: (a) SpiderMonkey, the baseline"},{"wmode":0,"bbox":{"x":317,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"interpreter, (b) TraceMonkey, (d) SquirrelFish Extreme (SFX), the"},{"wmode":0,"bbox":{"x":317,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"call-threaded JavaScript interpreter used in Apple’s WebKit, and"},{"wmode":0,"bbox":{"x":317,"y":635,"w":213,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"(e) V8, the method-compiling JavaScript VM from Google."},{"wmode":0,"bbox":{"x":328,"y":645,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":653,"text":"Figure 10 shows the relative speedups achieved by tracing, SFX,"},{"wmode":0,"bbox":{"x":317,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"and V8 against the baseline (SpiderMonkey). Tracing achieves the"},{"wmode":0,"bbox":{"x":317,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":673,"text":"best speedups in integer-heavy benchmarks, up to the 25x speedup"},{"wmode":0,"bbox":{"x":317,"y":675,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"on"},{"wmode":0,"bbox":{"x":325,"y":677,"w":86,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":325,"y":683,"text":" bitops-bitwise-and"},{"wmode":0,"bbox":{"x":412,"y":675,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":412,"y":683,"text":"."},{"wmode":0,"bbox":{"x":328,"y":685,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":693,"text":"TraceMonkey is the fastest VM on 9 of the 26 benchmarks"},{"wmode":0,"bbox":{"x":317,"y":695,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"("},{"wmode":0,"bbox":{"x":319,"y":697,"w":37,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":319,"y":703,"text":"3d-morph"},{"wmode":0,"bbox":{"x":357,"y":695,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":357,"y":703,"text":","},{"wmode":0,"bbox":{"x":359,"y":697,"w":118,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":359,"y":703,"text":" bitops-3bit-bits-in-byte"},{"wmode":0,"bbox":{"x":478,"y":695,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":478,"y":703,"text":","},{"wmode":0,"bbox":{"x":480,"y":697,"w":75,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":480,"y":703,"text":" bitops-bitwise-"},{"wmode":0,"bbox":{"x":317,"y":707,"w":14,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":713,"text":"and"},{"wmode":0,"bbox":{"x":331,"y":705,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":331,"y":713,"text":","},{"wmode":0,"bbox":{"x":333,"y":707,"w":54,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":333,"y":713,"text":" crypto-sha1"},{"wmode":0,"bbox":{"x":387,"y":705,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":387,"y":713,"text":","},{"wmode":0,"bbox":{"x":389,"y":707,"w":54,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":389,"y":713,"text":" math-cordic"},{"wmode":0,"bbox":{"x":443,"y":705,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":443,"y":713,"text":","},{"wmode":0,"bbox":{"x":445,"y":707,"w":82,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":445,"y":713,"text":" math-partial-sums"},{"wmode":0,"bbox":{"x":528,"y":705,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":528,"y":713,"text":","},{"wmode":0,"bbox":{"x":530,"y":707,"w":25,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":530,"y":713,"text":" math-"},{"wmode":0,"bbox":{"x":317,"y":717,"w":61,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"spectral-norm"},{"wmode":0,"bbox":{"x":378,"y":715,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":378,"y":723,"text":","},{"wmode":0,"bbox":{"x":380,"y":717,"w":65,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":380,"y":723,"text":" string-base64"},{"wmode":0,"bbox":{"x":445,"y":715,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":445,"y":723,"text":","},{"wmode":0,"bbox":{"x":447,"y":717,"w":102,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":447,"y":723,"text":" string-validate-input"},{"wmode":0,"bbox":{"x":550,"y":715,"w":5,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":550,"y":723,"text":")."}]}]},{"blocks":[{"type":"text","bbox":{"x":66,"y":236,"w":7,"h":11},"lines":[{"wmode":0,"bbox":{"x":66,"y":236,"w":7,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":66,"y":245,"text":"!\""}]},{"type":"text","bbox":{"x":66,"y":203,"w":7,"h":11},"lines":[{"wmode":0,"bbox":{"x":66,"y":203,"w":7,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":66,"y":212,"text":"#\""}]},{"type":"text","bbox":{"x":61,"y":170,"w":12,"h":11},"lines":[{"wmode":0,"bbox":{"x":61,"y":170,"w":12,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":61,"y":180,"text":"$!\""}]},{"type":"text","bbox":{"x":61,"y":138,"w":12,"h":11},"lines":[{"wmode":0,"bbox":{"x":61,"y":138,"w":12,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":61,"y":147,"text":"$#\""}]},{"type":"text","bbox":{"x":61,"y":105,"w":12,"h":11},"lines":[{"wmode":0,"bbox":{"x":61,"y":105,"w":12,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":61,"y":114,"text":"%!\""}]},{"type":"text","bbox":{"x":61,"y":72,"w":12,"h":11},"lines":[{"wmode":0,"bbox":{"x":61,"y":72,"w":12,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":61,"y":82,"text":"%#\""}]},{"type":"text","bbox":{"x":488,"y":90,"w":30,"h":11},"lines":[{"wmode":0,"bbox":{"x":488,"y":90,"w":30,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":488,"y":99,"text":"&'()*+,\""}]},{"type":"text","bbox":{"x":488,"y":108,"w":16,"h":11},"lines":[{"wmode":0,"bbox":{"x":488,"y":108,"w":16,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":488,"y":117,"text":"-./\""}]},{"type":"text","bbox":{"x":488,"y":125,"w":12,"h":11},"lines":[{"wmode":0,"bbox":{"x":488,"y":125,"w":12,"h":11},"font":{"name":"JFNKJW+Calibri","family":"serif","weight":"normal","style":"normal","size":9},"x":488,"y":134,"text":"01\""}]},{"type":"text","bbox":{"x":53,"y":352,"w":502,"h":70},"lines":[{"wmode":0,"bbox":{"x":54,"y":352,"w":39,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":360,"text":"Figure 10."},{"wmode":0,"bbox":{"x":93,"y":352,"w":462,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":93,"y":360,"text":" Speedup vs. a baseline JavaScript interpreter (SpiderMonkey) for our trace-based JIT compiler, Apple’s SquirrelFish Extreme"},{"wmode":0,"bbox":{"x":53,"y":362,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":370,"text":"inline threading interpreter and Google’s V8 JS compiler. Our system generates particularly efficient code for programs that benefit most from"},{"wmode":0,"bbox":{"x":53,"y":372,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":380,"text":"type specialization, which includes SunSpider Benchmark programs that perform bit manipulation. We type-specialize the code in question"},{"wmode":0,"bbox":{"x":53,"y":382,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":390,"text":"to use integer arithmetic, which substantially improves performance. For one of the benchmark programs we execute 25 times faster than"},{"wmode":0,"bbox":{"x":53,"y":392,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":400,"text":"the SpiderMonkey interpreter, and almost 5 times faster than V8 and SFX. For a large number of benchmarks all three VMs produce similar"},{"wmode":0,"bbox":{"x":53,"y":402,"w":502,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":410,"text":"results. We perform worst on benchmark programs that we do not trace and instead fall back onto the interpreter. This includes the recursive"},{"wmode":0,"bbox":{"x":53,"y":412,"w":43,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":420,"text":"benchmarks"},{"wmode":0,"bbox":{"x":97,"y":414,"w":91,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":97,"y":420,"text":" access-binary-trees"},{"wmode":0,"bbox":{"x":189,"y":412,"w":15,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":189,"y":420,"text":" and"},{"wmode":0,"bbox":{"x":204,"y":414,"w":105,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":204,"y":420,"text":" control-flow-recursive"},{"wmode":0,"bbox":{"x":309,"y":412,"w":200,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":309,"y":420,"text":", for which we currently don’t generate any native code."}]},{"type":"text","bbox":{"x":53,"y":442,"w":239,"h":110},"lines":[{"wmode":0,"bbox":{"x":53,"y":442,"w":59,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":450,"text":"In particular, the"},{"wmode":0,"bbox":{"x":113,"y":444,"w":30,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":113,"y":450,"text":" bitops"},{"wmode":0,"bbox":{"x":144,"y":442,"w":148,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":144,"y":450,"text":" benchmarks are short programs that per-"},{"wmode":0,"bbox":{"x":53,"y":452,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":460,"text":"form many bitwise operations, so TraceMonkey can cover the en-"},{"wmode":0,"bbox":{"x":53,"y":461,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":470,"text":"tire program with 1 or 2 traces that operate on integers. TraceMon-"},{"wmode":0,"bbox":{"x":53,"y":471,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":480,"text":"key runs all the other programs in this set almost entirely as native"},{"wmode":0,"bbox":{"x":53,"y":481,"w":19,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":490,"text":"code."},{"wmode":0,"bbox":{"x":65,"y":493,"w":47,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":65,"y":500,"text":"regexp-dna"},{"wmode":0,"bbox":{"x":113,"y":491,"w":180,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":113,"y":500,"text":" is dominated by regular expression matching,"},{"wmode":0,"bbox":{"x":53,"y":501,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":510,"text":"which is implemented in all 3 VMs by a special regular expression"},{"wmode":0,"bbox":{"x":53,"y":511,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":520,"text":"compiler. Thus, performance on this benchmark has little relation"},{"wmode":0,"bbox":{"x":53,"y":521,"w":204,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":530,"text":"to the trace compilation approach discussed in this paper."},{"wmode":0,"bbox":{"x":65,"y":531,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":540,"text":"TraceMonkey’s smaller speedups on the other benchmarks can"},{"wmode":0,"bbox":{"x":53,"y":541,"w":133,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":53,"y":549,"text":"be attributed to a few specific causes:"}]},{"type":"text","bbox":{"x":59,"y":566,"w":233,"h":51},"lines":[{"wmode":0,"bbox":{"x":59,"y":569,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":575,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":566,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":575,"text":" The implementation does not currently trace recursion, so"},{"wmode":0,"bbox":{"x":66,"y":577,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":586,"text":"TraceMonkey achieves a small speedup or no speedup on"},{"wmode":0,"bbox":{"x":66,"y":587,"w":166,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":596,"text":"benchmarks that use recursion extensively:"},{"wmode":0,"bbox":{"x":233,"y":589,"w":38,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":233,"y":596,"text":" 3d-cube"},{"wmode":0,"bbox":{"x":271,"y":587,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":271,"y":596,"text":","},{"wmode":0,"bbox":{"x":273,"y":589,"w":19,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":273,"y":596,"text":" 3d-"},{"wmode":0,"bbox":{"x":66,"y":599,"w":37,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":66,"y":605,"text":"raytrace"},{"wmode":0,"bbox":{"x":104,"y":597,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":104,"y":605,"text":","},{"wmode":0,"bbox":{"x":106,"y":599,"w":92,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":106,"y":605,"text":" access-binary-trees"},{"wmode":0,"bbox":{"x":199,"y":597,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":199,"y":605,"text":","},{"wmode":0,"bbox":{"x":201,"y":599,"w":73,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":201,"y":605,"text":" string-tagcloud"},{"wmode":0,"bbox":{"x":274,"y":597,"w":18,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":274,"y":605,"text":", and"},{"wmode":0,"bbox":{"x":66,"y":609,"w":98,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":66,"y":615,"text":"controlflow-recursive"},{"wmode":0,"bbox":{"x":165,"y":607,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":165,"y":615,"text":"."}]},{"type":"text","bbox":{"x":59,"y":620,"w":233,"h":41},"lines":[{"wmode":0,"bbox":{"x":59,"y":622,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":629,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":620,"w":168,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":629,"text":" The implementation does not currently trace"},{"wmode":0,"bbox":{"x":232,"y":623,"w":22,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":232,"y":629,"text":" eval"},{"wmode":0,"bbox":{"x":254,"y":621,"w":38,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":254,"y":629,"text":" and some"},{"wmode":0,"bbox":{"x":66,"y":631,"w":165,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":639,"text":"other functions implemented in C. Because"},{"wmode":0,"bbox":{"x":232,"y":633,"w":60,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":232,"y":639,"text":" date-format-"},{"wmode":0,"bbox":{"x":66,"y":643,"w":23,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":66,"y":649,"text":"tofte"},{"wmode":0,"bbox":{"x":90,"y":641,"w":16,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":90,"y":649,"text":" and"},{"wmode":0,"bbox":{"x":106,"y":643,"w":83,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":106,"y":649,"text":" date-format-xparb"},{"wmode":0,"bbox":{"x":190,"y":641,"w":102,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":190,"y":649,"text":" use such functions in their"},{"wmode":0,"bbox":{"x":66,"y":651,"w":121,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":659,"text":"main loops, we do not trace them."}]},{"type":"text","bbox":{"x":59,"y":664,"w":233,"h":61},"lines":[{"wmode":0,"bbox":{"x":59,"y":666,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":59,"y":672,"text":"•"},{"wmode":0,"bbox":{"x":63,"y":664,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":63,"y":672,"text":" The implementation does not currently trace through regular"},{"wmode":0,"bbox":{"x":66,"y":675,"w":38,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":683,"text":"expression"},{"wmode":0,"bbox":{"x":105,"y":677,"w":36,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":105,"y":683,"text":" replace"},{"wmode":0,"bbox":{"x":141,"y":675,"w":151,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":141,"y":683,"text":" operations. The replace function can be"},{"wmode":0,"bbox":{"x":66,"y":685,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":693,"text":"passed a function object used to compute the replacement text."},{"wmode":0,"bbox":{"x":66,"y":695,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":703,"text":"Our implementation currently does not trace functions called"},{"wmode":0,"bbox":{"x":66,"y":705,"w":131,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":713,"text":"as replace functions. The run time of"},{"wmode":0,"bbox":{"x":198,"y":707,"w":86,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":198,"y":713,"text":" string-unpack-code"},{"wmode":0,"bbox":{"x":284,"y":705,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":284,"y":713,"text":" is"},{"wmode":0,"bbox":{"x":66,"y":715,"w":73,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":66,"y":723,"text":"dominated by such a"},{"wmode":0,"bbox":{"x":140,"y":717,"w":35,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":140,"y":723,"text":" replace"},{"wmode":0,"bbox":{"x":176,"y":715,"w":17,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":176,"y":723,"text":" call."}]},{"type":"text","bbox":{"x":322,"y":441,"w":240,"h":51},"lines":[{"wmode":0,"bbox":{"x":322,"y":443,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":322,"y":449,"text":"•"},{"wmode":0,"bbox":{"x":326,"y":441,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":326,"y":449,"text":" Two programs trace well, but have a long compilation time."},{"wmode":0,"bbox":{"x":329,"y":454,"w":56,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":329,"y":460,"text":"access-nbody"},{"wmode":0,"bbox":{"x":386,"y":452,"w":127,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":386,"y":460,"text":" forms a large number of traces (81)."},{"wmode":0,"bbox":{"x":513,"y":454,"w":48,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":513,"y":460,"text":" crypto-md5"},{"wmode":0,"bbox":{"x":329,"y":461,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":470,"text":"forms one very long trace. We expect to improve performance"},{"wmode":0,"bbox":{"x":329,"y":471,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":480,"text":"on this programs by improving the compilation speed of nano-"},{"wmode":0,"bbox":{"x":329,"y":481,"w":9,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":490,"text":"jit."}]},{"type":"text","bbox":{"x":322,"y":494,"w":233,"h":101},"lines":[{"wmode":0,"bbox":{"x":322,"y":497,"w":4,"h":13},"font":{"name":"DSQVLB+CMSY8","family":"serif","weight":"normal","style":"italic","size":7},"x":322,"y":503,"text":"•"},{"wmode":0,"bbox":{"x":326,"y":494,"w":229,"h":11},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":326,"y":503,"text":" Some programs trace very well, and speed up compared to"},{"wmode":0,"bbox":{"x":329,"y":505,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":514,"text":"the interpreter, but are not as fast as SFX and/or V8, namely"},{"wmode":0,"bbox":{"x":329,"y":517,"w":89,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":329,"y":524,"text":"bitops-bits-in-byte"},{"wmode":0,"bbox":{"x":419,"y":515,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":419,"y":524,"text":","},{"wmode":0,"bbox":{"x":428,"y":517,"w":84,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":428,"y":524,"text":"bitops-nsieve-bits"},{"wmode":0,"bbox":{"x":513,"y":515,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":513,"y":524,"text":","},{"wmode":0,"bbox":{"x":523,"y":517,"w":32,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":523,"y":524,"text":"access-"},{"wmode":0,"bbox":{"x":329,"y":527,"w":37,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":329,"y":534,"text":"fannkuch"},{"wmode":0,"bbox":{"x":367,"y":525,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":367,"y":534,"text":","},{"wmode":0,"bbox":{"x":369,"y":527,"w":64,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":369,"y":534,"text":" access-nsieve"},{"wmode":0,"bbox":{"x":433,"y":525,"w":18,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":433,"y":534,"text":", and"},{"wmode":0,"bbox":{"x":451,"y":527,"w":49,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":451,"y":534,"text":" crypto-aes"},{"wmode":0,"bbox":{"x":501,"y":525,"w":54,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":501,"y":534,"text":". The reason is"},{"wmode":0,"bbox":{"x":329,"y":535,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":543,"text":"not clear, but all of these programs have nested loops with"},{"wmode":0,"bbox":{"x":329,"y":545,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":553,"text":"small bodies, so we suspect that the implementation has a rela-"},{"wmode":0,"bbox":{"x":329,"y":555,"w":144,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":563,"text":"tively high cost for calling nested traces."},{"wmode":0,"bbox":{"x":474,"y":557,"w":58,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":474,"y":563,"text":" string-fasta"},{"wmode":0,"bbox":{"x":533,"y":555,"w":23,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":533,"y":563,"text":" traces"},{"wmode":0,"bbox":{"x":329,"y":565,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":573,"text":"well, but its run time is dominated by string processing builtins,"},{"wmode":0,"bbox":{"x":329,"y":575,"w":226,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":583,"text":"which are unaffected by tracing and seem to be less efficient in"},{"wmode":0,"bbox":{"x":329,"y":585,"w":151,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":329,"y":593,"text":"SpiderMonkey than in the two other VMs."}]},{"type":"text","bbox":{"x":317,"y":605,"w":239,"h":120},"lines":[{"wmode":0,"bbox":{"x":328,"y":605,"w":115,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":613,"text":"Detailed performance metrics."},{"wmode":0,"bbox":{"x":444,"y":605,"w":111,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":444,"y":613,"text":" In Figure 11 we show the frac-"},{"wmode":0,"bbox":{"x":317,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"tion of instructions interpreted and the fraction of instructions exe-"},{"wmode":0,"bbox":{"x":317,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"cuted as native code. This figure shows that for many programs, we"},{"wmode":0,"bbox":{"x":317,"y":635,"w":168,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"are able to execute almost all the code natively."},{"wmode":0,"bbox":{"x":328,"y":645,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":653,"text":"Figure 12 breaks down the total execution time into four activ-"},{"wmode":0,"bbox":{"x":317,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"ities: interpreting bytecodes while not recording, recording traces"},{"wmode":0,"bbox":{"x":317,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":673,"text":"(including time taken to interpret the recorded trace), compiling"},{"wmode":0,"bbox":{"x":317,"y":675,"w":195,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"traces to native code, and executing native code traces."},{"wmode":0,"bbox":{"x":328,"y":685,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":693,"text":"These detailed metrics allow us to estimate parameters for a"},{"wmode":0,"bbox":{"x":317,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"simple model of tracing performance. These estimates should be"},{"wmode":0,"bbox":{"x":317,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":713,"text":"considered very rough, as the values observed on the individual"},{"wmode":0,"bbox":{"x":317,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"benchmarks have large standard deviations (on the order of the"}]}]},{"blocks":[{"type":"text","bbox":{"x":166,"y":70,"w":372,"h":10},"lines":[{"wmode":0,"bbox":{"x":166,"y":70,"w":22,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":166,"y":78,"text":"Loops"},{"wmode":0,"bbox":{"x":200,"y":70,"w":19,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":200,"y":78,"text":"Trees"},{"wmode":0,"bbox":{"x":232,"y":70,"w":23,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":232,"y":78,"text":"Traces"},{"wmode":0,"bbox":{"x":268,"y":70,"w":24,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":268,"y":78,"text":"Aborts"},{"wmode":0,"bbox":{"x":304,"y":70,"w":27,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":304,"y":78,"text":"Flushes"},{"wmode":0,"bbox":{"x":343,"y":70,"w":41,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":343,"y":78,"text":"Trees/Loop"},{"wmode":0,"bbox":{"x":396,"y":70,"w":42,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":396,"y":78,"text":"Traces/Tree"},{"wmode":0,"bbox":{"x":450,"y":70,"w":45,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":450,"y":78,"text":"Traces/Loop"},{"wmode":0,"bbox":{"x":507,"y":70,"w":30,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":507,"y":78,"text":"Speedup"}]},{"type":"text","bbox":{"x":71,"y":81,"w":467,"h":259},"lines":[{"wmode":0,"bbox":{"x":71,"y":81,"w":28,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":89,"text":"3d-cube"},{"wmode":0,"bbox":{"x":180,"y":81,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":180,"y":89,"text":"25"},{"wmode":0,"bbox":{"x":211,"y":81,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":89,"text":"27"},{"wmode":0,"bbox":{"x":247,"y":81,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":89,"text":"29"},{"wmode":0,"bbox":{"x":287,"y":81,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":89,"text":"3"},{"wmode":0,"bbox":{"x":327,"y":81,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":89,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":81,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":89,"text":"1.1"},{"wmode":0,"bbox":{"x":427,"y":81,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":89,"text":"1.1"},{"wmode":0,"bbox":{"x":484,"y":81,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":89,"text":"1.2"},{"wmode":0,"bbox":{"x":518,"y":81,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":89,"text":"2.20x"},{"wmode":0,"bbox":{"x":71,"y":91,"w":35,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":99,"text":"3d-morph"},{"wmode":0,"bbox":{"x":184,"y":91,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":99,"text":"5"},{"wmode":0,"bbox":{"x":216,"y":91,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":99,"text":"8"},{"wmode":0,"bbox":{"x":251,"y":91,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":99,"text":"8"},{"wmode":0,"bbox":{"x":287,"y":91,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":99,"text":"2"},{"wmode":0,"bbox":{"x":327,"y":91,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":99,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":91,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":99,"text":"1.6"},{"wmode":0,"bbox":{"x":427,"y":91,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":99,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":91,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":99,"text":"1.6"},{"wmode":0,"bbox":{"x":518,"y":91,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":99,"text":"2.86x"},{"wmode":0,"bbox":{"x":71,"y":100,"w":40,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":109,"text":"3d-raytrace"},{"wmode":0,"bbox":{"x":180,"y":100,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":180,"y":109,"text":"10"},{"wmode":0,"bbox":{"x":211,"y":100,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":109,"text":"25"},{"wmode":0,"bbox":{"x":242,"y":100,"w":13,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":242,"y":109,"text":"100"},{"wmode":0,"bbox":{"x":283,"y":100,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":283,"y":109,"text":"10"},{"wmode":0,"bbox":{"x":327,"y":100,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":109,"text":"1"},{"wmode":0,"bbox":{"x":373,"y":100,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":109,"text":"2.5"},{"wmode":0,"bbox":{"x":427,"y":100,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":109,"text":"4.0"},{"wmode":0,"bbox":{"x":480,"y":100,"w":15,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":480,"y":109,"text":"10.0"},{"wmode":0,"bbox":{"x":518,"y":100,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":109,"text":"1.18x"},{"wmode":0,"bbox":{"x":71,"y":110,"w":68,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":119,"text":"access-binary-trees"},{"wmode":0,"bbox":{"x":184,"y":110,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":119,"text":"0"},{"wmode":0,"bbox":{"x":216,"y":110,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":119,"text":"0"},{"wmode":0,"bbox":{"x":251,"y":110,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":119,"text":"0"},{"wmode":0,"bbox":{"x":287,"y":110,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":119,"text":"5"},{"wmode":0,"bbox":{"x":327,"y":110,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":119,"text":"0"},{"wmode":0,"bbox":{"x":381,"y":110,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":381,"y":119,"text":"-"},{"wmode":0,"bbox":{"x":435,"y":110,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":435,"y":119,"text":"-"},{"wmode":0,"bbox":{"x":492,"y":110,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":492,"y":119,"text":"-"},{"wmode":0,"bbox":{"x":518,"y":110,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":119,"text":"0.93x"},{"wmode":0,"bbox":{"x":71,"y":120,"w":59,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":129,"text":"access-fannkuch"},{"wmode":0,"bbox":{"x":180,"y":120,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":180,"y":129,"text":"10"},{"wmode":0,"bbox":{"x":211,"y":120,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":129,"text":"34"},{"wmode":0,"bbox":{"x":247,"y":120,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":129,"text":"57"},{"wmode":0,"bbox":{"x":283,"y":120,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":283,"y":129,"text":"24"},{"wmode":0,"bbox":{"x":327,"y":120,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":129,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":120,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":129,"text":"3.4"},{"wmode":0,"bbox":{"x":427,"y":120,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":129,"text":"1.7"},{"wmode":0,"bbox":{"x":484,"y":120,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":129,"text":"5.7"},{"wmode":0,"bbox":{"x":518,"y":120,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":129,"text":"2.20x"},{"wmode":0,"bbox":{"x":71,"y":130,"w":48,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":139,"text":"access-nbody"},{"wmode":0,"bbox":{"x":184,"y":130,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":139,"text":"8"},{"wmode":0,"bbox":{"x":211,"y":130,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":139,"text":"16"},{"wmode":0,"bbox":{"x":247,"y":130,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":139,"text":"18"},{"wmode":0,"bbox":{"x":287,"y":130,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":139,"text":"5"},{"wmode":0,"bbox":{"x":327,"y":130,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":139,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":130,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":139,"text":"2.0"},{"wmode":0,"bbox":{"x":427,"y":130,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":139,"text":"1.1"},{"wmode":0,"bbox":{"x":484,"y":130,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":139,"text":"2.3"},{"wmode":0,"bbox":{"x":518,"y":130,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":139,"text":"4.19x"},{"wmode":0,"bbox":{"x":71,"y":140,"w":48,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":149,"text":"access-nsieve"},{"wmode":0,"bbox":{"x":184,"y":140,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":149,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":140,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":149,"text":"6"},{"wmode":0,"bbox":{"x":251,"y":140,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":149,"text":"8"},{"wmode":0,"bbox":{"x":287,"y":140,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":149,"text":"3"},{"wmode":0,"bbox":{"x":327,"y":140,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":149,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":140,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":149,"text":"2.0"},{"wmode":0,"bbox":{"x":427,"y":140,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":149,"text":"1.3"},{"wmode":0,"bbox":{"x":484,"y":140,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":149,"text":"2.7"},{"wmode":0,"bbox":{"x":518,"y":140,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":149,"text":"3.05x"},{"wmode":0,"bbox":{"x":71,"y":150,"w":83,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":159,"text":"bitops-3bit-bits-in-byte"},{"wmode":0,"bbox":{"x":184,"y":150,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":159,"text":"2"},{"wmode":0,"bbox":{"x":216,"y":150,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":159,"text":"2"},{"wmode":0,"bbox":{"x":251,"y":150,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":159,"text":"2"},{"wmode":0,"bbox":{"x":287,"y":150,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":159,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":150,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":159,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":150,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":159,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":150,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":159,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":150,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":159,"text":"1.0"},{"wmode":0,"bbox":{"x":514,"y":150,"w":24,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":514,"y":159,"text":"25.47x"},{"wmode":0,"bbox":{"x":71,"y":160,"w":66,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":169,"text":"bitops-bits-in-byte"},{"wmode":0,"bbox":{"x":184,"y":160,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":169,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":160,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":169,"text":"3"},{"wmode":0,"bbox":{"x":251,"y":160,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":169,"text":"4"},{"wmode":0,"bbox":{"x":287,"y":160,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":169,"text":"1"},{"wmode":0,"bbox":{"x":327,"y":160,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":169,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":160,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":169,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":160,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":169,"text":"1.3"},{"wmode":0,"bbox":{"x":484,"y":160,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":169,"text":"1.3"},{"wmode":0,"bbox":{"x":518,"y":160,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":169,"text":"8.67x"},{"wmode":0,"bbox":{"x":71,"y":170,"w":66,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":178,"text":"bitops-bitwise-and"},{"wmode":0,"bbox":{"x":184,"y":170,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":178,"text":"1"},{"wmode":0,"bbox":{"x":216,"y":170,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":178,"text":"1"},{"wmode":0,"bbox":{"x":251,"y":170,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":178,"text":"1"},{"wmode":0,"bbox":{"x":287,"y":170,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":178,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":170,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":178,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":170,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":178,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":170,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":178,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":170,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":178,"text":"1.0"},{"wmode":0,"bbox":{"x":514,"y":170,"w":24,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":514,"y":178,"text":"25.20x"},{"wmode":0,"bbox":{"x":71,"y":180,"w":63,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":188,"text":"bitops-nsieve-bits"},{"wmode":0,"bbox":{"x":184,"y":180,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":188,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":180,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":188,"text":"3"},{"wmode":0,"bbox":{"x":251,"y":180,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":188,"text":"5"},{"wmode":0,"bbox":{"x":287,"y":180,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":188,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":180,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":188,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":180,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":188,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":180,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":188,"text":"1.7"},{"wmode":0,"bbox":{"x":484,"y":180,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":188,"text":"1.7"},{"wmode":0,"bbox":{"x":518,"y":180,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":188,"text":"2.75x"},{"wmode":0,"bbox":{"x":71,"y":190,"w":76,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":198,"text":"controlflow-recursive"},{"wmode":0,"bbox":{"x":184,"y":190,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":198,"text":"0"},{"wmode":0,"bbox":{"x":216,"y":190,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":198,"text":"0"},{"wmode":0,"bbox":{"x":251,"y":190,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":198,"text":"0"},{"wmode":0,"bbox":{"x":287,"y":190,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":198,"text":"1"},{"wmode":0,"bbox":{"x":327,"y":190,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":198,"text":"0"},{"wmode":0,"bbox":{"x":381,"y":190,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":381,"y":198,"text":"-"},{"wmode":0,"bbox":{"x":435,"y":190,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":435,"y":198,"text":"-"},{"wmode":0,"bbox":{"x":492,"y":190,"w":2,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":492,"y":198,"text":"-"},{"wmode":0,"bbox":{"x":518,"y":190,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":198,"text":"0.98x"},{"wmode":0,"bbox":{"x":71,"y":200,"w":37,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":208,"text":"crypto-aes"},{"wmode":0,"bbox":{"x":180,"y":200,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":180,"y":208,"text":"50"},{"wmode":0,"bbox":{"x":211,"y":200,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":208,"text":"72"},{"wmode":0,"bbox":{"x":247,"y":200,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":208,"text":"78"},{"wmode":0,"bbox":{"x":283,"y":200,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":283,"y":208,"text":"19"},{"wmode":0,"bbox":{"x":327,"y":200,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":208,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":200,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":208,"text":"1.4"},{"wmode":0,"bbox":{"x":427,"y":200,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":208,"text":"1.1"},{"wmode":0,"bbox":{"x":484,"y":200,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":208,"text":"1.6"},{"wmode":0,"bbox":{"x":518,"y":200,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":208,"text":"1.64x"},{"wmode":0,"bbox":{"x":71,"y":210,"w":41,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":218,"text":"crypto-md5"},{"wmode":0,"bbox":{"x":184,"y":210,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":218,"text":"4"},{"wmode":0,"bbox":{"x":216,"y":210,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":218,"text":"4"},{"wmode":0,"bbox":{"x":251,"y":210,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":218,"text":"5"},{"wmode":0,"bbox":{"x":287,"y":210,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":218,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":210,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":218,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":210,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":218,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":210,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":218,"text":"1.3"},{"wmode":0,"bbox":{"x":484,"y":210,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":218,"text":"1.3"},{"wmode":0,"bbox":{"x":518,"y":210,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":218,"text":"2.30x"},{"wmode":0,"bbox":{"x":71,"y":220,"w":42,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":228,"text":"crypto-sha1"},{"wmode":0,"bbox":{"x":184,"y":220,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":228,"text":"5"},{"wmode":0,"bbox":{"x":216,"y":220,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":228,"text":"5"},{"wmode":0,"bbox":{"x":247,"y":220,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":228,"text":"10"},{"wmode":0,"bbox":{"x":287,"y":220,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":228,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":220,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":228,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":220,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":228,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":220,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":228,"text":"2.0"},{"wmode":0,"bbox":{"x":484,"y":220,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":228,"text":"2.0"},{"wmode":0,"bbox":{"x":518,"y":220,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":228,"text":"5.95x"},{"wmode":0,"bbox":{"x":71,"y":230,"w":61,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":238,"text":"date-format-tofte"},{"wmode":0,"bbox":{"x":184,"y":230,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":238,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":230,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":238,"text":"3"},{"wmode":0,"bbox":{"x":251,"y":230,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":238,"text":"4"},{"wmode":0,"bbox":{"x":287,"y":230,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":238,"text":"7"},{"wmode":0,"bbox":{"x":327,"y":230,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":238,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":230,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":238,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":230,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":238,"text":"1.3"},{"wmode":0,"bbox":{"x":484,"y":230,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":238,"text":"1.3"},{"wmode":0,"bbox":{"x":518,"y":230,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":238,"text":"1.07x"},{"wmode":0,"bbox":{"x":71,"y":240,"w":65,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":248,"text":"date-format-xparb"},{"wmode":0,"bbox":{"x":184,"y":240,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":248,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":240,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":248,"text":"3"},{"wmode":0,"bbox":{"x":247,"y":240,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":248,"text":"11"},{"wmode":0,"bbox":{"x":287,"y":240,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":248,"text":"3"},{"wmode":0,"bbox":{"x":327,"y":240,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":248,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":240,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":248,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":240,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":248,"text":"3.7"},{"wmode":0,"bbox":{"x":484,"y":240,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":248,"text":"3.7"},{"wmode":0,"bbox":{"x":518,"y":240,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":248,"text":"0.98x"},{"wmode":0,"bbox":{"x":71,"y":250,"w":43,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":258,"text":"math-cordic"},{"wmode":0,"bbox":{"x":184,"y":250,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":258,"text":"2"},{"wmode":0,"bbox":{"x":216,"y":250,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":258,"text":"4"},{"wmode":0,"bbox":{"x":251,"y":250,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":258,"text":"5"},{"wmode":0,"bbox":{"x":287,"y":250,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":258,"text":"1"},{"wmode":0,"bbox":{"x":327,"y":250,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":258,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":250,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":258,"text":"2.0"},{"wmode":0,"bbox":{"x":427,"y":250,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":258,"text":"1.3"},{"wmode":0,"bbox":{"x":484,"y":250,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":258,"text":"2.5"},{"wmode":0,"bbox":{"x":518,"y":250,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":258,"text":"4.92x"},{"wmode":0,"bbox":{"x":71,"y":260,"w":65,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":268,"text":"math-partial-sums"},{"wmode":0,"bbox":{"x":184,"y":260,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":268,"text":"2"},{"wmode":0,"bbox":{"x":216,"y":260,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":268,"text":"4"},{"wmode":0,"bbox":{"x":251,"y":260,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":268,"text":"4"},{"wmode":0,"bbox":{"x":287,"y":260,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":268,"text":"1"},{"wmode":0,"bbox":{"x":327,"y":260,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":268,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":260,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":268,"text":"2.0"},{"wmode":0,"bbox":{"x":427,"y":260,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":268,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":260,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":268,"text":"2.0"},{"wmode":0,"bbox":{"x":518,"y":260,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":268,"text":"5.90x"},{"wmode":0,"bbox":{"x":71,"y":270,"w":70,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":278,"text":"math-spectral-norm"},{"wmode":0,"bbox":{"x":180,"y":270,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":180,"y":278,"text":"15"},{"wmode":0,"bbox":{"x":211,"y":270,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":278,"text":"20"},{"wmode":0,"bbox":{"x":247,"y":270,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":278,"text":"20"},{"wmode":0,"bbox":{"x":287,"y":270,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":278,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":270,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":278,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":270,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":278,"text":"1.3"},{"wmode":0,"bbox":{"x":427,"y":270,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":278,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":270,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":278,"text":"1.3"},{"wmode":0,"bbox":{"x":518,"y":270,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":278,"text":"7.12x"},{"wmode":0,"bbox":{"x":71,"y":280,"w":40,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":288,"text":"regexp-dna"},{"wmode":0,"bbox":{"x":184,"y":280,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":288,"text":"2"},{"wmode":0,"bbox":{"x":216,"y":280,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":288,"text":"2"},{"wmode":0,"bbox":{"x":251,"y":280,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":288,"text":"2"},{"wmode":0,"bbox":{"x":287,"y":280,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":288,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":280,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":288,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":280,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":288,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":280,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":288,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":280,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":288,"text":"1.0"},{"wmode":0,"bbox":{"x":518,"y":280,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":288,"text":"4.21x"},{"wmode":0,"bbox":{"x":71,"y":290,"w":48,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":298,"text":"string-base64"},{"wmode":0,"bbox":{"x":184,"y":290,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":298,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":290,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":298,"text":"5"},{"wmode":0,"bbox":{"x":251,"y":290,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":298,"text":"7"},{"wmode":0,"bbox":{"x":287,"y":290,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":298,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":290,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":298,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":290,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":298,"text":"1.7"},{"wmode":0,"bbox":{"x":427,"y":290,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":298,"text":"1.4"},{"wmode":0,"bbox":{"x":484,"y":290,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":298,"text":"2.3"},{"wmode":0,"bbox":{"x":518,"y":290,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":298,"text":"2.53x"},{"wmode":0,"bbox":{"x":71,"y":300,"w":40,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":308,"text":"string-fasta"},{"wmode":0,"bbox":{"x":184,"y":300,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":308,"text":"5"},{"wmode":0,"bbox":{"x":211,"y":300,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":308,"text":"11"},{"wmode":0,"bbox":{"x":247,"y":300,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":308,"text":"15"},{"wmode":0,"bbox":{"x":287,"y":300,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":308,"text":"6"},{"wmode":0,"bbox":{"x":327,"y":300,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":308,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":300,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":308,"text":"2.2"},{"wmode":0,"bbox":{"x":427,"y":300,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":308,"text":"1.4"},{"wmode":0,"bbox":{"x":484,"y":300,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":308,"text":"3.0"},{"wmode":0,"bbox":{"x":518,"y":300,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":308,"text":"1.49x"},{"wmode":0,"bbox":{"x":71,"y":310,"w":54,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":318,"text":"string-tagcloud"},{"wmode":0,"bbox":{"x":184,"y":310,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":318,"text":"3"},{"wmode":0,"bbox":{"x":216,"y":310,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":318,"text":"6"},{"wmode":0,"bbox":{"x":251,"y":310,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":251,"y":318,"text":"6"},{"wmode":0,"bbox":{"x":287,"y":310,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":318,"text":"5"},{"wmode":0,"bbox":{"x":327,"y":310,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":318,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":310,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":318,"text":"2.0"},{"wmode":0,"bbox":{"x":427,"y":310,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":318,"text":"1.0"},{"wmode":0,"bbox":{"x":484,"y":310,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":318,"text":"2.0"},{"wmode":0,"bbox":{"x":518,"y":310,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":318,"text":"1.09x"},{"wmode":0,"bbox":{"x":71,"y":320,"w":69,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":328,"text":"string-unpack-code"},{"wmode":0,"bbox":{"x":184,"y":320,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":328,"text":"4"},{"wmode":0,"bbox":{"x":216,"y":320,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":216,"y":328,"text":"4"},{"wmode":0,"bbox":{"x":247,"y":320,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":328,"text":"37"},{"wmode":0,"bbox":{"x":287,"y":320,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":328,"text":"0"},{"wmode":0,"bbox":{"x":327,"y":320,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":328,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":320,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":328,"text":"1.0"},{"wmode":0,"bbox":{"x":427,"y":320,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":328,"text":"9.3"},{"wmode":0,"bbox":{"x":484,"y":320,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":328,"text":"9.3"},{"wmode":0,"bbox":{"x":518,"y":320,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":328,"text":"1.20x"},{"wmode":0,"bbox":{"x":71,"y":330,"w":72,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":71,"y":338,"text":"string-validate-input"},{"wmode":0,"bbox":{"x":184,"y":330,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":184,"y":338,"text":"6"},{"wmode":0,"bbox":{"x":211,"y":330,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":211,"y":338,"text":"10"},{"wmode":0,"bbox":{"x":247,"y":330,"w":8,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":247,"y":338,"text":"13"},{"wmode":0,"bbox":{"x":287,"y":330,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":287,"y":338,"text":"1"},{"wmode":0,"bbox":{"x":327,"y":330,"w":4,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":327,"y":338,"text":"0"},{"wmode":0,"bbox":{"x":373,"y":330,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":373,"y":338,"text":"1.7"},{"wmode":0,"bbox":{"x":427,"y":330,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":427,"y":338,"text":"1.3"},{"wmode":0,"bbox":{"x":484,"y":330,"w":11,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":484,"y":338,"text":"2.2"},{"wmode":0,"bbox":{"x":518,"y":330,"w":20,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":518,"y":338,"text":"1.86x"}]},{"type":"text","bbox":{"x":161,"y":354,"w":284,"h":11},"lines":[{"wmode":0,"bbox":{"x":161,"y":354,"w":38,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":161,"y":362,"text":"Figure 13."},{"wmode":0,"bbox":{"x":200,"y":354,"w":246,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":200,"y":362,"text":" Detailed trace recording statistics for the SunSpider benchmark set."}]},{"type":"text","bbox":{"x":54,"y":384,"w":239,"h":329},"lines":[{"wmode":0,"bbox":{"x":54,"y":384,"w":69,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":392,"text":"mean). We exclude"},{"wmode":0,"bbox":{"x":123,"y":386,"w":49,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":123,"y":392,"text":" regexp-dna"},{"wmode":0,"bbox":{"x":173,"y":384,"w":119,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":173,"y":392,"text":" from the following calculations,"},{"wmode":0,"bbox":{"x":54,"y":394,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":402,"text":"because most of its time is spent in the regular expression matcher,"},{"wmode":0,"bbox":{"x":54,"y":404,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":412,"text":"which has much different performance characteristics from the"},{"wmode":0,"bbox":{"x":54,"y":414,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":422,"text":"other programs. (Note that this only makes a difference of about"},{"wmode":0,"bbox":{"x":54,"y":424,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":432,"text":"10% in the results.) Dividing the total execution time in processor"},{"wmode":0,"bbox":{"x":54,"y":434,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":442,"text":"clock cycles by the number of bytecodes executed in the base"},{"wmode":0,"bbox":{"x":54,"y":444,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":452,"text":"interpreter shows that on average, a bytecode executes in about"},{"wmode":0,"bbox":{"x":54,"y":454,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":462,"text":"35 cycles. Native traces take about 9 cycles per bytecode, a 3.9x"},{"wmode":0,"bbox":{"x":54,"y":464,"w":101,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":472,"text":"speedup over the interpreter."},{"wmode":0,"bbox":{"x":65,"y":474,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":482,"text":"Using similar computations, we find that trace recording takes"},{"wmode":0,"bbox":{"x":54,"y":484,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":492,"text":"about 3800 cycles per bytecode, and compilation 3150 cycles per"},{"wmode":0,"bbox":{"x":54,"y":493,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":502,"text":"bytecode. Hence, during recording and compiling the VM runs at"},{"wmode":0,"bbox":{"x":54,"y":503,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":512,"text":"1/200 the speed of the interpreter. Because it costs 6950 cycles to"},{"wmode":0,"bbox":{"x":54,"y":513,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":522,"text":"compile a bytecode, and we save 26 cycles each time that code is"},{"wmode":0,"bbox":{"x":54,"y":523,"w":212,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":532,"text":"run natively, we break even after running a trace 270 times."},{"wmode":0,"bbox":{"x":65,"y":533,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":542,"text":"The other VMs we compared with achieve an overall speedup"},{"wmode":0,"bbox":{"x":54,"y":543,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":552,"text":"of 3.0x relative to our baseline interpreter. Our estimated native"},{"wmode":0,"bbox":{"x":54,"y":553,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":562,"text":"code speedup of 3.9x is significantly better. This suggests that"},{"wmode":0,"bbox":{"x":54,"y":563,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":572,"text":"our compilation techniques can generate more efficient native code"},{"wmode":0,"bbox":{"x":54,"y":573,"w":136,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":581,"text":"than any other current JavaScript VM."},{"wmode":0,"bbox":{"x":65,"y":583,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":591,"text":"These estimates also indicate that our startup performance could"},{"wmode":0,"bbox":{"x":54,"y":593,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":601,"text":"be substantially better if we improved the speed of trace recording"},{"wmode":0,"bbox":{"x":54,"y":603,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":611,"text":"and compilation. The estimated 200x slowdown for recording and"},{"wmode":0,"bbox":{"x":54,"y":613,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":621,"text":"compilation is very rough, and may be influenced by startup factors"},{"wmode":0,"bbox":{"x":54,"y":623,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":631,"text":"in the interpreter (e.g., caches that have not warmed up yet during"},{"wmode":0,"bbox":{"x":54,"y":633,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":641,"text":"recording). One observation supporting this conjecture is that in"},{"wmode":0,"bbox":{"x":54,"y":643,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":651,"text":"the tracer, interpreted bytecodes take about 180 cycles to run. Still,"},{"wmode":0,"bbox":{"x":54,"y":653,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":661,"text":"recording and compilation are clearly both expensive, and a better"},{"wmode":0,"bbox":{"x":54,"y":663,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":671,"text":"implementation, possibly including redesign of the LIR abstract"},{"wmode":0,"bbox":{"x":54,"y":673,"w":203,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":681,"text":"syntax or encoding, would improve startup performance."},{"wmode":0,"bbox":{"x":65,"y":683,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":691,"text":"Our performance results confirm that type specialization using"},{"wmode":0,"bbox":{"x":54,"y":693,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":701,"text":"trace trees substantially improves performance. We are able to"},{"wmode":0,"bbox":{"x":54,"y":703,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":711,"text":"outperform the fastest available JavaScript compiler (V8) and the"}]},{"type":"text","bbox":{"x":317,"y":384,"w":239,"h":20},"lines":[{"wmode":0,"bbox":{"x":317,"y":384,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":392,"text":"fastest available JavaScript inline threaded interpreter (SFX) on 9"},{"wmode":0,"bbox":{"x":317,"y":394,"w":66,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":402,"text":"of 26 benchmarks."}]},{"type":"text","bbox":{"x":317,"y":430,"w":84,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":430,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":440,"text":"8."},{"wmode":0,"bbox":{"x":336,"y":430,"w":65,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":336,"y":440,"text":"Related Work"}]},{"type":"text","bbox":{"x":317,"y":445,"w":239,"h":280},"lines":[{"wmode":0,"bbox":{"x":317,"y":445,"w":166,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":317,"y":454,"text":"Trace optimization for dynamic languages."},{"wmode":0,"bbox":{"x":483,"y":446,"w":72,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":483,"y":454,"text":" The closest area of"},{"wmode":0,"bbox":{"x":317,"y":456,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":464,"text":"related work is on applying trace optimization to type-specialize"},{"wmode":0,"bbox":{"x":317,"y":466,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":474,"text":"dynamic languages. Existing work shares the idea of generating"},{"wmode":0,"bbox":{"x":317,"y":476,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":484,"text":"type-specialized code speculatively with guards along interpreter"},{"wmode":0,"bbox":{"x":317,"y":486,"w":23,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":494,"text":"traces."},{"wmode":0,"bbox":{"x":328,"y":496,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":504,"text":"To our knowledge, Rigo’s Psyco (16) is the only published"},{"wmode":0,"bbox":{"x":317,"y":506,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":514,"text":"type-specializing trace compiler for a dynamic language (Python)."},{"wmode":0,"bbox":{"x":317,"y":516,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":524,"text":"Psyco does not attempt to identify hot loops or inline function calls."},{"wmode":0,"bbox":{"x":317,"y":525,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":534,"text":"Instead, Psyco transforms loops to mutual recursion before running"},{"wmode":0,"bbox":{"x":317,"y":535,"w":89,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":544,"text":"and traces all operations."},{"wmode":0,"bbox":{"x":328,"y":545,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":554,"text":"Pall’s LuaJIT is a Lua VM in development that uses trace com-"},{"wmode":0,"bbox":{"x":317,"y":555,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":564,"text":"pilation ideas. (1). There are no publications on LuaJIT but the cre-"},{"wmode":0,"bbox":{"x":317,"y":565,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":574,"text":"ator has told us that LuaJIT has a similar design to our system, but"},{"wmode":0,"bbox":{"x":317,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":584,"text":"will use a less aggressive type speculation (e.g., using a floating-"},{"wmode":0,"bbox":{"x":317,"y":585,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":594,"text":"point representation for all number values) and does not generate"},{"wmode":0,"bbox":{"x":317,"y":595,"w":107,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":604,"text":"nested traces for nested loops."},{"wmode":0,"bbox":{"x":328,"y":605,"w":108,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":328,"y":613,"text":"General trace optimization."},{"wmode":0,"bbox":{"x":437,"y":605,"w":118,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":437,"y":613,"text":" General trace optimization has"},{"wmode":0,"bbox":{"x":317,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":623,"text":"a longer history that has treated mostly native code and typed"},{"wmode":0,"bbox":{"x":317,"y":625,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":633,"text":"languages like Java. Thus, these systems have focused less on type"},{"wmode":0,"bbox":{"x":317,"y":635,"w":170,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":643,"text":"specialization and more on other optimizations."},{"wmode":0,"bbox":{"x":328,"y":645,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":653,"text":"Dynamo (7) by Bala et al, introduced native code tracing as a"},{"wmode":0,"bbox":{"x":317,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"replacement for profile-guided optimization (PGO). A major goal"},{"wmode":0,"bbox":{"x":317,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":673,"text":"was to perform PGO online so that the profile was specific to"},{"wmode":0,"bbox":{"x":317,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"the current execution. Dynamo used loop headers as candidate hot"},{"wmode":0,"bbox":{"x":317,"y":685,"w":195,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":693,"text":"traces, but did not try to create loop traces specifically."},{"wmode":0,"bbox":{"x":328,"y":695,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":703,"text":"Trace trees were originally proposed by Gal et al. (11) in the"},{"wmode":0,"bbox":{"x":317,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":713,"text":"context of Java, a statically typed language. Their trace trees ac-"},{"wmode":0,"bbox":{"x":317,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"tually inlined parts of outer loops within the inner loops (because"}]}]},{"blocks":[{"type":"text","bbox":{"x":115,"y":254,"w":180,"h":6},"lines":[{"wmode":0,"bbox":{"x":115,"y":254,"w":7,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":115,"y":259,"text":"!\"#"},{"wmode":0,"bbox":{"x":148,"y":254,"w":10,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":148,"y":259,"text":"$!\"#"},{"wmode":0,"bbox":{"x":182,"y":254,"w":10,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":182,"y":259,"text":"%!\"#"},{"wmode":0,"bbox":{"x":216,"y":254,"w":10,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":216,"y":259,"text":"&!\"#"},{"wmode":0,"bbox":{"x":250,"y":254,"w":10,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":250,"y":259,"text":"'!\"#"},{"wmode":0,"bbox":{"x":282,"y":254,"w":13,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":282,"y":259,"text":"(!!\"#"}]},{"type":"text","bbox":{"x":88,"y":243,"w":26,"h":5},"lines":[{"wmode":0,"bbox":{"x":88,"y":243,"w":26,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":88,"y":247,"text":")*+,-./#0$1$23#"}]},{"type":"text","bbox":{"x":85,"y":236,"w":30,"h":5},"lines":[{"wmode":0,"bbox":{"x":85,"y":236,"w":30,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":85,"y":241,"text":")*+45678#0$1923#"}]},{"type":"text","bbox":{"x":82,"y":230,"w":32,"h":5},"lines":[{"wmode":0,"bbox":{"x":82,"y":230,"w":32,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":82,"y":234,"text":")*+6:;<6:,/#0(1$23#"}]},{"type":"text","bbox":{"x":68,"y":223,"w":46,"h":5},"lines":[{"wmode":0,"bbox":{"x":68,"y":223,"w":46,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":68,"y":227,"text":":,,/==+.>?:6;+<6//=#0!1923#"}]},{"type":"text","bbox":{"x":73,"y":217,"w":41,"h":5},"lines":[{"wmode":0,"bbox":{"x":73,"y":217,"w":41,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":73,"y":221,"text":":,,/==+@:??A-,8#0$1$23#"}]},{"type":"text","bbox":{"x":78,"y":204,"w":36,"h":11},"lines":[{"wmode":0,"bbox":{"x":78,"y":210,"w":36,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":78,"y":214,"text":":,,/==+?.5*;#0%1$23#"},{"wmode":0,"bbox":{"x":78,"y":204,"w":36,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":78,"y":208,"text":":,,/==+?=>/B/#0)1!23#"}]},{"type":"text","bbox":{"x":59,"y":197,"w":55,"h":5},"lines":[{"wmode":0,"bbox":{"x":59,"y":197,"w":55,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":59,"y":201,"text":".><57=+).><+.><=+>?+.;</#0$C1C23#"}]},{"type":"text","bbox":{"x":70,"y":190,"w":45,"h":5},"lines":[{"wmode":0,"bbox":{"x":70,"y":190,"w":45,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":70,"y":195,"text":".><57=+.><=+>?+.;</#0'1D23#"}]},{"type":"text","bbox":{"x":67,"y":184,"w":47,"h":5},"lines":[{"wmode":0,"bbox":{"x":67,"y":184,"w":47,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":67,"y":188,"text":".><57=+.><E>=/+:?*#0$C1$23#"}]},{"type":"text","bbox":{"x":71,"y":177,"w":43,"h":5},"lines":[{"wmode":0,"bbox":{"x":71,"y":177,"w":43,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":71,"y":182,"text":".><57=+?=>/B/+.><=#0$1D23#"}]},{"type":"text","bbox":{"x":65,"y":171,"w":50,"h":5},"lines":[{"wmode":0,"bbox":{"x":65,"y":171,"w":50,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":65,"y":175,"text":",5?<65FG5E+6/,-6=>B/#0(1!23#"}]},{"type":"text","bbox":{"x":81,"y":151,"w":33,"h":18},"lines":[{"wmode":0,"bbox":{"x":84,"y":164,"w":30,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":84,"y":168,"text":",6;7<5+:/=#0(1&23#"},{"wmode":0,"bbox":{"x":82,"y":158,"w":33,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":82,"y":162,"text":",6;7<5+4*C#0$1)23#"},{"wmode":0,"bbox":{"x":81,"y":151,"w":33,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":81,"y":155,"text":",6;7<5+=8:(#0C1923#"}]},{"type":"text","bbox":{"x":70,"y":138,"w":44,"h":11},"lines":[{"wmode":0,"bbox":{"x":71,"y":145,"w":43,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":71,"y":149,"text":"*:</+@564:<+<5H/#0(1(23#"},{"wmode":0,"bbox":{"x":70,"y":138,"w":44,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":70,"y":142,"text":"*:</+@564:<+27:6.#0(1!23#"}]},{"type":"text","bbox":{"x":81,"y":132,"w":33,"h":5},"lines":[{"wmode":0,"bbox":{"x":81,"y":132,"w":33,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":81,"y":136,"text":"4:<8+,56*>,#0%1923#"}]},{"type":"text","bbox":{"x":70,"y":125,"w":44,"h":5},"lines":[{"wmode":0,"bbox":{"x":70,"y":125,"w":44,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":70,"y":129,"text":"4:<8+7:6I:F+=-4=#0C1923#"}]},{"type":"text","bbox":{"x":67,"y":118,"w":48,"h":5},"lines":[{"wmode":0,"bbox":{"x":67,"y":118,"w":48,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":67,"y":123,"text":"4:<8+=7/,<6:F+?564#0D1(23#"}]},{"type":"text","bbox":{"x":82,"y":112,"w":32,"h":5},"lines":[{"wmode":0,"bbox":{"x":82,"y":112,"w":32,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":82,"y":116,"text":"6/J/27+*?:#0%1$23#"}]},{"type":"text","bbox":{"x":78,"y":105,"w":36,"h":5},"lines":[{"wmode":0,"bbox":{"x":78,"y":105,"w":36,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":78,"y":110,"text":"=<6>?J+.:=/&%#0$1C23#"}]},{"type":"text","bbox":{"x":82,"y":99,"w":32,"h":5},"lines":[{"wmode":0,"bbox":{"x":82,"y":99,"w":32,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":82,"y":103,"text":"=<6>?J+@:=<:#0(1C23#"}]},{"type":"text","bbox":{"x":76,"y":92,"w":38,"h":5},"lines":[{"wmode":0,"bbox":{"x":76,"y":92,"w":38,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":76,"y":96,"text":"=<6>?J+<:J,F5-*#0(1(23#"}]},{"type":"text","bbox":{"x":66,"y":79,"w":48,"h":11},"lines":[{"wmode":0,"bbox":{"x":68,"y":86,"w":46,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":68,"y":90,"text":"=<6>?J+-?7:,A+,5*/#0(1$23#"},{"wmode":0,"bbox":{"x":66,"y":79,"w":48,"h":5},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":4},"x":66,"y":83,"text":"=<6>?J+B:F>*:</+>?7-<#0(1923#"}]},{"type":"text","bbox":{"x":88,"y":270,"w":185,"h":6},"lines":[{"wmode":0,"bbox":{"x":88,"y":270,"w":21,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":88,"y":275,"text":"K?</676/<#"},{"wmode":0,"bbox":{"x":122,"y":270,"w":19,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":122,"y":275,"text":"L5?><56#"},{"wmode":0,"bbox":{"x":154,"y":270,"w":16,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":154,"y":275,"text":"M/,56*#"},{"wmode":0,"bbox":{"x":183,"y":270,"w":19,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":183,"y":275,"text":"N547>F/#"},{"wmode":0,"bbox":{"x":215,"y":270,"w":22,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":215,"y":275,"text":"N:FF#O6:,/#"},{"wmode":0,"bbox":{"x":250,"y":270,"w":23,"h":6},"font":{"name":"BFRJLG+Calibri","family":"serif","weight":"normal","style":"normal","size":5},"x":250,"y":275,"text":"M-?#O6:,/#"}]},{"type":"text","bbox":{"x":54,"y":299,"w":239,"h":60},"lines":[{"wmode":0,"bbox":{"x":54,"y":299,"w":222,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":54,"y":307,"text":"Figure 12. Fraction of time spent on major VM activities."},{"wmode":0,"bbox":{"x":276,"y":299,"w":16,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":276,"y":307,"text":" The"},{"wmode":0,"bbox":{"x":54,"y":309,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":317,"text":"speedup vs. interpreter is shown in parentheses next to each test."},{"wmode":0,"bbox":{"x":54,"y":319,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":327,"text":"Most programs where the VM spends the majority of its time run-"},{"wmode":0,"bbox":{"x":54,"y":329,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":337,"text":"ning native code have a good speedup. Recording and compilation"},{"wmode":0,"bbox":{"x":54,"y":339,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":347,"text":"costs can be substantial; speeding up those parts of the implemen-"},{"wmode":0,"bbox":{"x":54,"y":349,"w":166,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":357,"text":"tation would improve SunSpider performance."}]},{"type":"text","bbox":{"x":54,"y":396,"w":241,"h":329},"lines":[{"wmode":0,"bbox":{"x":54,"y":396,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":404,"text":"inner loops become hot first), leading to much greater tail duplica-"},{"wmode":0,"bbox":{"x":54,"y":406,"w":16,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":414,"text":"tion."},{"wmode":0,"bbox":{"x":65,"y":416,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":424,"text":"YETI, from Zaleski et al. (19) applied Dynamo-style tracing"},{"wmode":0,"bbox":{"x":54,"y":426,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":434,"text":"to Java in order to achieve inlining, indirect jump elimination,"},{"wmode":0,"bbox":{"x":54,"y":436,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":444,"text":"and other optimizations. Their primary focus was on designing an"},{"wmode":0,"bbox":{"x":54,"y":446,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":454,"text":"interpreter that could easily be gradually re-engineered as a tracing"},{"wmode":0,"bbox":{"x":54,"y":456,"w":16,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":464,"text":"VM."},{"wmode":0,"bbox":{"x":65,"y":466,"w":229,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":474,"text":"Suganuma et al. (18) described region-based compilation (RBC),"},{"wmode":0,"bbox":{"x":54,"y":476,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":484,"text":"a relative of tracing. A region is an subprogram worth optimizing"},{"wmode":0,"bbox":{"x":54,"y":486,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":494,"text":"that can include subsets of any number of methods. Thus, the com-"},{"wmode":0,"bbox":{"x":54,"y":496,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":504,"text":"piler has more flexibility and can potentially generate better code,"},{"wmode":0,"bbox":{"x":54,"y":506,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":514,"text":"but the profiling and compilation systems are correspondingly more"},{"wmode":0,"bbox":{"x":54,"y":516,"w":32,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":524,"text":"complex."},{"wmode":0,"bbox":{"x":65,"y":525,"w":171,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":534,"text":"Type specialization for dynamic languages."},{"wmode":0,"bbox":{"x":237,"y":525,"w":55,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":237,"y":534,"text":" Dynamic lan-"},{"wmode":0,"bbox":{"x":54,"y":535,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":544,"text":"guage implementors have long recognized the importance of type"},{"wmode":0,"bbox":{"x":54,"y":545,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":554,"text":"specialization for performance. Most previous work has focused on"},{"wmode":0,"bbox":{"x":54,"y":555,"w":93,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":564,"text":"methods instead of traces."},{"wmode":0,"bbox":{"x":65,"y":565,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":574,"text":"Chambers et. al (9) pioneered the idea of compiling multiple"},{"wmode":0,"bbox":{"x":54,"y":575,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":584,"text":"versions of a procedure specialized for the input types in the lan-"},{"wmode":0,"bbox":{"x":54,"y":585,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":594,"text":"guage Self. In one implementation, they generated a specialized"},{"wmode":0,"bbox":{"x":54,"y":595,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":604,"text":"method online each time a method was called with new input types."},{"wmode":0,"bbox":{"x":54,"y":605,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":613,"text":"In another, they used an offline whole-program static analysis to"},{"wmode":0,"bbox":{"x":54,"y":615,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":623,"text":"infer input types and constant receiver types at call sites. Interest-"},{"wmode":0,"bbox":{"x":54,"y":625,"w":233,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":633,"text":"ingly, the two techniques produced nearly the same performance."},{"wmode":0,"bbox":{"x":65,"y":635,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":643,"text":"Salib (17) designed a type inference algorithm for Python based"},{"wmode":0,"bbox":{"x":54,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":653,"text":"on the Cartesian Product Algorithm and used the results to special-"},{"wmode":0,"bbox":{"x":54,"y":655,"w":166,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":663,"text":"ize on types and translate the program to C++."},{"wmode":0,"bbox":{"x":65,"y":665,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":65,"y":673,"text":"McCloskey (14) has work in progress based on a language-"},{"wmode":0,"bbox":{"x":54,"y":675,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":683,"text":"independent type inference that is used to generate efficient C"},{"wmode":0,"bbox":{"x":54,"y":685,"w":189,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":693,"text":"implementations of JavaScript and Python programs."},{"wmode":0,"bbox":{"x":65,"y":695,"w":149,"h":11},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":8},"x":65,"y":703,"text":"Native code generation by interpreters."},{"wmode":0,"bbox":{"x":215,"y":695,"w":77,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":215,"y":703,"text":" The traditional inter-"},{"wmode":0,"bbox":{"x":54,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":713,"text":"preter design is a virtual machine that directly executes ASTs or"},{"wmode":0,"bbox":{"x":54,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":723,"text":"machine-code-like bytecodes. Researchers have shown how to gen-"}]},{"type":"text","bbox":{"x":317,"y":71,"w":239,"h":210},"lines":[{"wmode":0,"bbox":{"x":317,"y":71,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":79,"text":"erate native code with nearly the same structure but better perfor-"},{"wmode":0,"bbox":{"x":317,"y":81,"w":25,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":89,"text":"mance."},{"wmode":0,"bbox":{"x":328,"y":91,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":99,"text":"Call threading, also known as context threading (8), compiles"},{"wmode":0,"bbox":{"x":317,"y":101,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":109,"text":"methods by generating a native call instruction to an interpreter"},{"wmode":0,"bbox":{"x":317,"y":111,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":119,"text":"method for each interpreter bytecode. A call-return pair has been"},{"wmode":0,"bbox":{"x":317,"y":121,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":129,"text":"shown to be a potentially much more efficient dispatch mechanism"},{"wmode":0,"bbox":{"x":317,"y":131,"w":222,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":139,"text":"than the indirect jumps used in standard bytecode interpreters."},{"wmode":0,"bbox":{"x":328,"y":141,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":149,"text":"Inline threading (15) copies chunks of interpreter native code"},{"wmode":0,"bbox":{"x":317,"y":151,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":159,"text":"which implement the required bytecodes into a native code cache,"},{"wmode":0,"bbox":{"x":317,"y":161,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":169,"text":"thus acting as a simple per-method JIT compiler that eliminates the"},{"wmode":0,"bbox":{"x":317,"y":171,"w":66,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":179,"text":"dispatch overhead."},{"wmode":0,"bbox":{"x":328,"y":181,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":189,"text":"Neither call threading nor inline threading perform type special-"},{"wmode":0,"bbox":{"x":317,"y":191,"w":26,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":199,"text":"ization."},{"wmode":0,"bbox":{"x":328,"y":201,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":209,"text":"Apple’s SquirrelFish Extreme (5) is a JavaScript implementa-"},{"wmode":0,"bbox":{"x":317,"y":211,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":219,"text":"tion based on call threading with selective inline threading. Com-"},{"wmode":0,"bbox":{"x":317,"y":221,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":229,"text":"bined with efficient interpreter engineering, these threading tech-"},{"wmode":0,"bbox":{"x":317,"y":231,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":239,"text":"niques have given SFX excellent performance on the standard Sun-"},{"wmode":0,"bbox":{"x":317,"y":241,"w":71,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":249,"text":"Spider benchmarks."},{"wmode":0,"bbox":{"x":328,"y":251,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":259,"text":"Google’s V8 is a JavaScript implementation primarily based"},{"wmode":0,"bbox":{"x":317,"y":260,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":269,"text":"on inline threading, with call threading only for very complex"},{"wmode":0,"bbox":{"x":317,"y":270,"w":39,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":279,"text":"operations."}]},{"type":"text","bbox":{"x":317,"y":289,"w":75,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":289,"w":8,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":300,"text":"9."},{"wmode":0,"bbox":{"x":336,"y":289,"w":56,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":336,"y":300,"text":"Conclusions"}]},{"type":"text","bbox":{"x":317,"y":306,"w":239,"h":160},"lines":[{"wmode":0,"bbox":{"x":317,"y":306,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":314,"text":"This paper described how to run dynamic languages efficiently by"},{"wmode":0,"bbox":{"x":317,"y":316,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":324,"text":"recording hot traces and generating type-specialized native code."},{"wmode":0,"bbox":{"x":317,"y":326,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":334,"text":"Our technique focuses on aggressively inlined loops, and for each"},{"wmode":0,"bbox":{"x":317,"y":336,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":344,"text":"loop, it generates a tree of native code traces representing the"},{"wmode":0,"bbox":{"x":317,"y":345,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":354,"text":"paths and value types through the loop observed at run time. We"},{"wmode":0,"bbox":{"x":317,"y":355,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":364,"text":"explained how to identify loop nesting relationships and generate"},{"wmode":0,"bbox":{"x":317,"y":365,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":374,"text":"nested traces in order to avoid excessive code duplication due"},{"wmode":0,"bbox":{"x":317,"y":375,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":384,"text":"to the many paths through a loop nest. We described our type"},{"wmode":0,"bbox":{"x":317,"y":385,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":394,"text":"specialization algorithm. We also described our trace compiler,"},{"wmode":0,"bbox":{"x":317,"y":395,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":404,"text":"which translates a trace from an intermediate representation to"},{"wmode":0,"bbox":{"x":317,"y":405,"w":153,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":414,"text":"optimized native code in two linear passes."},{"wmode":0,"bbox":{"x":328,"y":415,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":424,"text":"Our experimental results show that in practice loops typically"},{"wmode":0,"bbox":{"x":317,"y":425,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":433,"text":"are entered with only a few different combinations of value types"},{"wmode":0,"bbox":{"x":317,"y":435,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":443,"text":"of variables. Thus, a small number of traces per loop is sufficient"},{"wmode":0,"bbox":{"x":317,"y":445,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":453,"text":"to run a program efficiently. Our experiments also show that on"},{"wmode":0,"bbox":{"x":317,"y":455,"w":234,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":463,"text":"programs amenable to tracing, we achieve speedups of 2x to 20x."}]},{"type":"text","bbox":{"x":317,"y":474,"w":86,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":474,"w":13,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":485,"text":"10."},{"wmode":0,"bbox":{"x":341,"y":474,"w":61,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":341,"y":485,"text":"Future Work"}]},{"type":"text","bbox":{"x":317,"y":490,"w":239,"h":130},"lines":[{"wmode":0,"bbox":{"x":317,"y":490,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":499,"text":"Work is underway in a number of areas to further improve the"},{"wmode":0,"bbox":{"x":317,"y":500,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":509,"text":"performance of our trace-based JavaScript compiler. We currently"},{"wmode":0,"bbox":{"x":317,"y":510,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":518,"text":"do not trace across recursive function calls, but plan to add the"},{"wmode":0,"bbox":{"x":317,"y":520,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":528,"text":"support for this capability in the near term. We are also exploring"},{"wmode":0,"bbox":{"x":317,"y":530,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":538,"text":"adoption of the existing work on tree recompilation in the context"},{"wmode":0,"bbox":{"x":317,"y":540,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":548,"text":"of the presented dynamic compiler in order to minimize JIT pause"},{"wmode":0,"bbox":{"x":317,"y":550,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":558,"text":"times and obtain the best of both worlds, fast tree stitching as well"},{"wmode":0,"bbox":{"x":317,"y":560,"w":197,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":568,"text":"as the improved code quality due to tree recompilation."},{"wmode":0,"bbox":{"x":328,"y":570,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":578,"text":"We also plan on adding support for tracing across regular ex-"},{"wmode":0,"bbox":{"x":317,"y":580,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":588,"text":"pression substitutions using lambda functions, function applica-"},{"wmode":0,"bbox":{"x":317,"y":590,"w":140,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":598,"text":"tions and expression evaluation using"},{"wmode":0,"bbox":{"x":457,"y":592,"w":22,"h":8},"font":{"name":"RRLDLB+CMTT9","family":"monospace","weight":"normal","style":"normal","size":8},"x":457,"y":598,"text":" eval"},{"wmode":0,"bbox":{"x":480,"y":590,"w":76,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":480,"y":598,"text":". All these language"},{"wmode":0,"bbox":{"x":317,"y":600,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":608,"text":"constructs are currently executed via interpretation, which limits"},{"wmode":0,"bbox":{"x":317,"y":610,"w":201,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":618,"text":"our performance for applications that use those features."}]},{"type":"text","bbox":{"x":317,"y":629,"w":85,"h":14},"lines":[{"wmode":0,"bbox":{"x":317,"y":629,"w":85,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":317,"y":639,"text":"Acknowledgments"}]},{"type":"text","bbox":{"x":317,"y":645,"w":239,"h":80},"lines":[{"wmode":0,"bbox":{"x":317,"y":645,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":653,"text":"Parts of this effort have been sponsored by the National Science"},{"wmode":0,"bbox":{"x":317,"y":655,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":663,"text":"Foundation under grants CNS-0615443 and CNS-0627747, as well"},{"wmode":0,"bbox":{"x":317,"y":665,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":673,"text":"as by the California MICRO Program and industrial sponsor Sun"},{"wmode":0,"bbox":{"x":317,"y":675,"w":145,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":683,"text":"Microsystems under Project No. 07-127."},{"wmode":0,"bbox":{"x":328,"y":685,"w":227,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":328,"y":693,"text":"The U.S. Government is authorized to reproduce and distribute"},{"wmode":0,"bbox":{"x":317,"y":695,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":703,"text":"reprints for Governmental purposes notwithstanding any copyright"},{"wmode":0,"bbox":{"x":317,"y":705,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":713,"text":"annotation thereon. Any opinions, findings, and conclusions or rec-"},{"wmode":0,"bbox":{"x":317,"y":715,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":317,"y":723,"text":"ommendations expressed here are those of the author and should"}]}]},{"blocks":[{"type":"text","bbox":{"x":54,"y":71,"w":239,"h":40},"lines":[{"wmode":0,"bbox":{"x":54,"y":71,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":79,"text":"not be interpreted as necessarily representing the official views,"},{"wmode":0,"bbox":{"x":54,"y":81,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":89,"text":"policies or endorsements, either expressed or implied, of the Na-"},{"wmode":0,"bbox":{"x":54,"y":91,"w":239,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":99,"text":"tional Science foundation (NSF), any other agency of the U.S. Gov-"},{"wmode":0,"bbox":{"x":54,"y":101,"w":185,"h":10},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":8},"x":54,"y":109,"text":"ernment, or any of the companies mentioned above."}]},{"type":"text","bbox":{"x":54,"y":120,"w":50,"h":14},"lines":[{"wmode":0,"bbox":{"x":54,"y":120,"w":50,"h":14},"font":{"name":"TACTGM+NimbusRomNo9L-Medi","family":"serif","weight":"bold","style":"normal","size":10},"x":54,"y":130,"text":"References"}]},{"type":"text","bbox":{"x":57,"y":136,"w":235,"h":237},"lines":[{"wmode":0,"bbox":{"x":57,"y":136,"w":35,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":143,"text":"[1] LuaJIT"},{"wmode":0,"bbox":{"x":103,"y":136,"w":27,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":103,"y":143,"text":"roadmap"},{"wmode":0,"bbox":{"x":141,"y":136,"w":15,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":141,"y":143,"text":"2008"},{"wmode":0,"bbox":{"x":167,"y":136,"w":2,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":167,"y":143,"text":"-"},{"wmode":0,"bbox":{"x":180,"y":136,"w":112,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":180,"y":143,"text":"http://lua-users.org/lists/lua-l/2008-"},{"wmode":0,"bbox":{"x":70,"y":145,"w":61,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":152,"text":"02/msg00051.html."},{"wmode":0,"bbox":{"x":57,"y":157,"w":235,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":164,"text":"[2] Mozilla — Firefox web browser and Thunderbird email client -"},{"wmode":0,"bbox":{"x":70,"y":166,"w":79,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":173,"text":"http://www.mozilla.com."},{"wmode":0,"bbox":{"x":57,"y":177,"w":153,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":185,"text":"[3] SPECJVM98 - http://www.spec.org/jvm98/."},{"wmode":0,"bbox":{"x":57,"y":189,"w":59,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":196,"text":"[4] SpiderMonkey"},{"wmode":0,"bbox":{"x":152,"y":189,"w":46,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":152,"y":196,"text":"(JavaScript-C)"},{"wmode":0,"bbox":{"x":233,"y":189,"w":22,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":233,"y":196,"text":"Engine"},{"wmode":0,"bbox":{"x":290,"y":189,"w":2,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":290,"y":196,"text":"-"},{"wmode":0,"bbox":{"x":70,"y":198,"w":133,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":205,"text":"http://www.mozilla.org/js/spidermonkey/."},{"wmode":0,"bbox":{"x":57,"y":210,"w":235,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":217,"text":"[5] Surfin’ Safari - Blog Archive - Announcing SquirrelFish Extreme -"},{"wmode":0,"bbox":{"x":70,"y":219,"w":193,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":226,"text":"http://webkit.org/blog/214/introducing-squirrelfish-extreme/."},{"wmode":0,"bbox":{"x":57,"y":230,"w":155,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":238,"text":"[6] A. Aho, R. Sethi, J. Ullman, and M. Lam."},{"wmode":0,"bbox":{"x":220,"y":230,"w":72,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":220,"y":238,"text":"Compilers: Principles,"},{"wmode":0,"bbox":{"x":70,"y":239,"w":88,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":247,"text":"techniques, and tools, 2006."},{"wmode":0,"bbox":{"x":57,"y":251,"w":151,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":258,"text":"[7] V. Bala, E. Duesterwald, and S. Banerjia."},{"wmode":0,"bbox":{"x":215,"y":251,"w":77,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":215,"y":258,"text":"Dynamo: A transparent"},{"wmode":0,"bbox":{"x":70,"y":260,"w":106,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":267,"text":"dynamic optimization system. In"},{"wmode":0,"bbox":{"x":177,"y":260,"w":115,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":177,"y":267,"text":" Proceedings of the ACM SIGPLAN"},{"wmode":0,"bbox":{"x":70,"y":269,"w":220,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":70,"y":276,"text":"Conference on Programming Language Design and Implementation"},{"wmode":0,"bbox":{"x":291,"y":269,"w":1,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":291,"y":276,"text":","},{"wmode":0,"bbox":{"x":70,"y":278,"w":98,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":285,"text":"pages 1–12. ACM Press, 2000."},{"wmode":0,"bbox":{"x":57,"y":290,"w":235,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":297,"text":"[8] M. Berndl, B. Vitale, M. Zaleski, and A. Brown. Context Threading:"},{"wmode":0,"bbox":{"x":70,"y":299,"w":222,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":306,"text":"a Flexible and Efficient Dispatch Technique for Virtual Machine In-"},{"wmode":0,"bbox":{"x":70,"y":307,"w":43,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":315,"text":"terpreters. In"},{"wmode":0,"bbox":{"x":114,"y":307,"w":179,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":114,"y":315,"text":" Code Generation and Optimization, 2005. CGO 2005."},{"wmode":0,"bbox":{"x":70,"y":316,"w":90,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":70,"y":324,"text":"International Symposium on"},{"wmode":0,"bbox":{"x":161,"y":316,"w":65,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":161,"y":324,"text":", pages 15–26, 2005."},{"wmode":0,"bbox":{"x":57,"y":328,"w":106,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":57,"y":336,"text":"[9] C. Chambers and D. Ungar."},{"wmode":0,"bbox":{"x":171,"y":328,"w":121,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":171,"y":336,"text":"Customization: Optimizing Compiler"},{"wmode":0,"bbox":{"x":70,"y":337,"w":222,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":344,"text":"Technology for SELF, a Dynamically-Typed O bject-Oriented Pro-"},{"wmode":0,"bbox":{"x":70,"y":346,"w":69,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":353,"text":"gramming Language."},{"wmode":0,"bbox":{"x":147,"y":346,"w":6,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":147,"y":353,"text":"In"},{"wmode":0,"bbox":{"x":153,"y":346,"w":139,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":153,"y":353,"text":" Proceedings of the ACM SIGPLAN 1989"},{"wmode":0,"bbox":{"x":70,"y":355,"w":220,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":70,"y":362,"text":"Conference on Programming Language Design and Implementation"},{"wmode":0,"bbox":{"x":291,"y":355,"w":1,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":291,"y":362,"text":","},{"wmode":0,"bbox":{"x":70,"y":364,"w":160,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":70,"y":371,"text":"pages 146–160. ACM New York, NY, USA, 1989."}]},{"type":"text","bbox":{"x":317,"y":72,"w":239,"h":27},"lines":[{"wmode":0,"bbox":{"x":317,"y":72,"w":40,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":79,"text":"[10] A. Gal."},{"wmode":0,"bbox":{"x":357,"y":72,"w":198,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":357,"y":79,"text":" Efficient Bytecode Verification and Compilation in a Virtual"},{"wmode":0,"bbox":{"x":333,"y":81,"w":69,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":333,"y":88,"text":"Machine Dissertation"},{"wmode":0,"bbox":{"x":403,"y":81,"w":152,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":403,"y":88,"text":". PhD thesis, University Of California, Irvine,"},{"wmode":0,"bbox":{"x":333,"y":90,"w":17,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":97,"text":"2006."}]},{"type":"text","bbox":{"x":317,"y":102,"w":239,"h":36},"lines":[{"wmode":0,"bbox":{"x":317,"y":102,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":109,"text":"[11] A. Gal, C. W. Probst, and M. Franz. HotpathVM: An effective JIT"},{"wmode":0,"bbox":{"x":333,"y":111,"w":140,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":118,"text":"compiler for resource-constrained devices."},{"wmode":0,"bbox":{"x":482,"y":111,"w":6,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":482,"y":118,"text":"In"},{"wmode":0,"bbox":{"x":489,"y":111,"w":66,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":489,"y":118,"text":" Proceedings of the"},{"wmode":0,"bbox":{"x":333,"y":120,"w":199,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":333,"y":127,"text":"International Conference on Virtual Execution Environments"},{"wmode":0,"bbox":{"x":532,"y":120,"w":23,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":532,"y":127,"text":", pages"},{"wmode":0,"bbox":{"x":333,"y":129,"w":90,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":136,"text":"144–153. ACM Press, 2006."}]},{"type":"text","bbox":{"x":317,"y":141,"w":239,"h":48},"lines":[{"wmode":0,"bbox":{"x":317,"y":141,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":148,"text":"[12] C. Garrett, J. Dean, D. Grove, and C. Chambers. Measurement and"},{"wmode":0,"bbox":{"x":333,"y":150,"w":192,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":157,"text":"Application of Dynamic Receiver Class Distributions. 1994."},{"wmode":0,"bbox":{"x":317,"y":162,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":169,"text":"[13] J. Ha, M. R. Haghighat, S. Cong, and K. S. McKinley. A concurrent"},{"wmode":0,"bbox":{"x":333,"y":171,"w":156,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":178,"text":"trace-based just-in-time compiler for javascript."},{"wmode":0,"bbox":{"x":496,"y":171,"w":59,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":496,"y":178,"text":"Dept.of Computer"},{"wmode":0,"bbox":{"x":333,"y":180,"w":196,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":187,"text":"Sciences, The University of Texas at Austin, TR-09-06, 2009."}]},{"type":"text","bbox":{"x":317,"y":192,"w":239,"h":69},"lines":[{"wmode":0,"bbox":{"x":317,"y":192,"w":147,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":199,"text":"[14] B. McCloskey. Personal communication."},{"wmode":0,"bbox":{"x":317,"y":204,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":211,"text":"[15] I. Piumarta and F. Riccardi. Optimizing direct threaded code by selec-"},{"wmode":0,"bbox":{"x":333,"y":213,"w":51,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":220,"text":"tive inlining. In"},{"wmode":0,"bbox":{"x":385,"y":213,"w":170,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":385,"y":220,"text":" Proceedings of the ACM SIGPLAN 1998 conference"},{"wmode":0,"bbox":{"x":333,"y":222,"w":179,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":333,"y":229,"text":"on Programming language design and implementation"},{"wmode":0,"bbox":{"x":513,"y":222,"w":42,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":513,"y":229,"text":", pages 291–"},{"wmode":0,"bbox":{"x":333,"y":231,"w":124,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":238,"text":"300. ACM New York, NY, USA, 1998."},{"wmode":0,"bbox":{"x":317,"y":242,"w":45,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":250,"text":"[16] A. Rigo."},{"wmode":0,"bbox":{"x":368,"y":242,"w":187,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":368,"y":250,"text":"Representation-Based Just-In-time Specialization and the"},{"wmode":0,"bbox":{"x":333,"y":251,"w":99,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":259,"text":"Psyco Prototype for Python. In"},{"wmode":0,"bbox":{"x":433,"y":251,"w":23,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":433,"y":259,"text":" PEPM"},{"wmode":0,"bbox":{"x":456,"y":251,"w":21,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":456,"y":259,"text":", 2004."}]},{"type":"text","bbox":{"x":317,"y":263,"w":239,"h":18},"lines":[{"wmode":0,"bbox":{"x":317,"y":263,"w":47,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":271,"text":"[17] M. Salib."},{"wmode":0,"bbox":{"x":373,"y":263,"w":182,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":373,"y":271,"text":"Starkiller: A Static Type Inferencer and Compiler for"},{"wmode":0,"bbox":{"x":333,"y":272,"w":34,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":280,"text":"Python. In"},{"wmode":0,"bbox":{"x":367,"y":272,"w":52,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":367,"y":280,"text":" Master’s Thesis"},{"wmode":0,"bbox":{"x":420,"y":272,"w":21,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":420,"y":280,"text":", 2004."}]},{"type":"text","bbox":{"x":317,"y":284,"w":239,"h":66},"lines":[{"wmode":0,"bbox":{"x":317,"y":284,"w":239,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":292,"text":"[18] T. Suganuma, T. Yasue, and T. Nakatani. A Region-Based Compila-"},{"wmode":0,"bbox":{"x":333,"y":293,"w":129,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":301,"text":"tion Technique for Dynamic Compilers."},{"wmode":0,"bbox":{"x":463,"y":293,"w":92,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":463,"y":301,"text":" ACM Transactions on Pro-"},{"wmode":0,"bbox":{"x":333,"y":302,"w":146,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":333,"y":310,"text":"gramming Languages and Systems (TOPLAS)"},{"wmode":0,"bbox":{"x":479,"y":302,"w":73,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":479,"y":310,"text":", 28(1):134–174, 2006."},{"wmode":0,"bbox":{"x":317,"y":314,"w":165,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":317,"y":322,"text":"[19] M. Zaleski, A. D. Brown, and K. Stoodley."},{"wmode":0,"bbox":{"x":490,"y":314,"w":65,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":490,"y":322,"text":"YETI: A graduallY"},{"wmode":0,"bbox":{"x":333,"y":323,"w":94,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":331,"text":"Extensible Trace Interpreter."},{"wmode":0,"bbox":{"x":436,"y":323,"w":6,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":436,"y":331,"text":"In"},{"wmode":0,"bbox":{"x":443,"y":323,"w":112,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":443,"y":331,"text":" Proceedings of the International"},{"wmode":0,"bbox":{"x":333,"y":332,"w":153,"h":9},"font":{"name":"FCXRUF+NimbusRomNo9L-ReguItal","family":"serif","weight":"normal","style":"italic","size":7},"x":333,"y":339,"text":"Conference on Virtual Execution Environments"},{"wmode":0,"bbox":{"x":487,"y":332,"w":68,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":487,"y":339,"text":", pages 83–93. ACM"},{"wmode":0,"bbox":{"x":333,"y":341,"w":38,"h":9},"font":{"name":"KUYGUP+NimbusRomNo9L-Regu","family":"serif","weight":"normal","style":"normal","size":7},"x":333,"y":348,"text":"Press, 2007."}]}]}]}