فهرست منبع

Added a small optimization example

Taddeus Kroes 11 سال پیش
والد
کامیت
4ad2e109e0
1فایلهای تغییر یافته به همراه57 افزوده شده و 1 حذف شده
  1. 57 1
      README.md

+ 57 - 1
README.md

@@ -7,6 +7,7 @@ purpose of practicing OCaml LLVM bindings and seeing how well LLVM optimizes
 arrays. Brainfuck commands are transformed to LLVM IR, which is generated in
 arrays. Brainfuck commands are transformed to LLVM IR, which is generated in
 such a way that it is easy to optimize for LLVM's `opt` utility.
 such a way that it is easy to optimize for LLVM's `opt` utility.
 
 
+
 Building and usage
 Building and usage
 ==================
 ==================
 
 
@@ -15,7 +16,7 @@ Building the `bf` compiler (Debian dependencies):
     $ sudo apt-get install ocaml llvm-3.4 libllvm-3.4-ocaml-dev
     $ sudo apt-get install ocaml llvm-3.4 libllvm-3.4-ocaml-dev
     $ make
     $ make
 
 
-Building a brainfuck program (plain and optimized):
+Building a Brainfuck program (plain and optimized):
 
 
     $ make hello hello-opt  # compile file "hello.b" to binaries
     $ make hello hello-opt  # compile file "hello.b" to binaries
     $ ./hello
     $ ./hello
@@ -35,3 +36,58 @@ Examining generated LLVM:
     ...
     ...
     $ echo ++++++++++++. | ./bf | opt -O3 -S
     $ echo ++++++++++++. | ./bf | opt -O3 -S
     ...
     ...
+
+
+Optimization example
+--------------------
+
+The `text.py` utility genrates single-cell Brainfuck code for a given text:
+
+    $ ./text.py Hello World!
+    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+    +++++++++++++++++++++++++++++.
+    +++++++.
+    .
+    +++.
+    -------------------------------------------------------------------------------.
+    +++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+    ++++++++++++++++++++++++.
+    +++.
+    ------.
+    --------.
+    -------------------------------------------------------------------.
+    -----------------------.
+
+The LLVM optimization engine is able to completely optimize away array accesses
+(in the absence of loops):
+
+    $ ./text.py Hello World! | ./bf | opt -O3 -S
+    ; ModuleID = '<stdin>'
+    target datalayout = "e"
+
+    ; Function Attrs: nounwind
+    declare i32 @putchar(i8) #0
+
+    declare void @exit(i32)
+
+    define void @_start() {
+    entry:
+        %0 = tail call i32 @putchar(i8 72)
+        %1 = tail call i32 @putchar(i8 101)
+        %2 = tail call i32 @putchar(i8 108)
+        %3 = tail call i32 @putchar(i8 108)
+        %4 = tail call i32 @putchar(i8 111)
+        %5 = tail call i32 @putchar(i8 32)
+        %6 = tail call i32 @putchar(i8 87)
+        %7 = tail call i32 @putchar(i8 111)
+        %8 = tail call i32 @putchar(i8 114)
+        %9 = tail call i32 @putchar(i8 108)
+        %10 = tail call i32 @putchar(i8 100)
+        %11 = tail call i32 @putchar(i8 33)
+        %12 = tail call i32 @putchar(i8 10)
+        tail call void @exit(i32 0)
+        ret void
+    }
+
+    attributes #0 = { nounwind }
+