Minor fixes for B3 IR documentation
[WebKit-https.git] / Websites / webkit.org / docs / b3 / intermediate-representation.html
index 7b22817..7c015f3 100644 (file)
@@ -1,9 +1,18 @@
 <html>
-  <head>
-    <title>B3 Intermediate Representation</title>
-    <link rel="stylesheet" type="text/css" href="style.css">
-  </head>
-  <body>
+<head>
+  <title>B3 Intermediate Representation</title>
+  <link rel="stylesheet" type="text/css" href="style.css">
+</head>
+<body>
+  <div id="banner">
+    <a href="http://www.webkit.org/" class="banner-link">
+      <div id="logo" class="site-logo">
+        WebKit
+        <span class="tagline">Open Source Web Browser</span>
+      </div>
+    </a>
+  </div>
+  <div id="contents">
     <h1><a href="index.html">Bare Bones Backend</a> / B3 Intermediate Representation</h1>
     <p>B3 IR is a C-like SSA representation of a procedure.  A procedure has a root block at
       which it starts execution when it is invoked.  A procedure does not have to terminate, but
     <h2>Stack Slot</h2>
 
     <p>B3 exposes the concept of stack-allocated data and gives the client a lot of control.
-      You can force stack slots to end up at a particular offset from the frame pointer, though
-      this is very dangerous.  After compilation is done, you can get the selected frame pointer
-      offset from any stack slot.  Usually, you let B3 select where stack slots go, and then use
-      the StackSlot API to get its FP offset after compilation.</p>
+      By default, stack slots get allocated wherever B3 chooses. It will try to pack them as
+      much as possible. After compilation is done, you can retrieve each stack slot's location
+      in the form of an offset from the frame pointer.</p>
+
+    <p>You can force stack slots to end up at a particular offset from the frame pointer, though
+      this is very dangerous.  For example, B3 assumes that it can use the slots closest to the
+      frame pointer for callee-saves, and currently when you force something to a particular
+      frame pointer offset, there is no mechanism to notice that this space is also being used
+      for callee-saves.  Therefore, we recommend not using the frame pointer offset forcing
+      feature unless you know a lot about the ABI and you have no other choice.</p>
 
     <p>Stack slots are also used for creating non-SSA variables with the intention of having B3
-      convert them into SSA.  There are two kinds of stack lots.</p>
+      convert them into SSA.  There are two kinds of stack slots.</p>
 
     <dl>
       <dt>Anonymous</dt>
       predecessors.  Each basic block may have zero or more successors.  The successors are
       controlled by the basic block's last Value, which must be a ControlValue instance.</p>
 
-    <p>Each basic block contains a Vector&lt;Value*&gt; as the contents of the block.</p>
+    <p>Each basic block contains a Vector&lt;Value*&gt; as the contents of the block. Control
+      flow inside the block is implicit based on the order of Values in the vector.</p>
 
     <h2>Opcodes</h2>
 
 
       <dt>T Div(T, T)</dt>
       <dd>Works with any type except Void.  For integer types, this represents signed division
-        with round-to-zero.  Its behavior is undefined for x/0 or -2`^`31/-1.  For floating
+        with round-to-zero.  Its behavior is undefined for x/0 or -2<sup>31</sup>/-1.  For floating
         point types, this represents division according to the IEEE 854 spec.</dd>
 
       <dt>T Mod(T, T)</dt>
       <dd>Works with any type except Void.  For integer types, this represents signed modulo.
-        Its behavior is undefined for x%0 or -2`^`31%-1.  For floating point types, this
+        Its behavior is undefined for x%0 or -2<sup>31</sup>%-1.  For floating point types, this
         represents modulo according to "fmod()".</dd>
 
       <dt>T Neg(T)</dt>
       <dt>T ChillDiv(T, T)</dt>
       <dd>Chill division.  Valid for Int32 and Int64.  An operation is said to be chill if it
         returns a sensible value whenever its non-chill form would have had undefined behavior.
-        ChillDiv turns x/0 into 0 and -2`^`31/-1 into -2`^`31.  This is a separate opcode
+        ChillDiv turns x/0 into 0 and -2<sup>31</sup>/-1 into -2<sup>31</sup>.  This is a separate opcode
         because it's exactly the semantics of division on ARM64, and it's also exactly the
         semantics that JavaScript wants for "(x/y)|0".</dd>
 
       <dt>T ChillMod(T, T)</dt>
-      <dd>Chill modulo.  Valid for Int32 and Int64.  ChllMod turns x%0 into 0 and -2`^`31%-1
-        into 0.</dd>
+      <dd>Chill modulo.  Valid for Int32 and Int64.  ChllMod turns x%0 into 0 and
+        -2<sup>31</sup>%-1 into 0.</dd>
 
       <dt>T BitAnd(T, T)</dt>
       <dd>Bitwise and.  Valid for Int32 and Int64.</dd>
@@ -515,6 +531,7 @@ patchpoint->setGenerator(
         transformations.</dd>
     </dl>
 
-  </body>
+  </div>
+</body>
 </html>