Prechádzať zdrojové kódy

Extended optimization example

Taddeus Kroes 11 rokov pred
rodič
commit
ddb09a9dd7
1 zmenil súbory, kde vykonal 48 pridanie a 11 odobranie
  1. 48 11
      README.md

+ 48 - 11
README.md

@@ -58,18 +58,58 @@ The `text.py` utility genrates single-cell Brainfuck code for a given text:
     -------------------------------------------------------------------.
     -----------------------.
 
-The LLVM optimization engine is able to completely optimize away array accesses
-(in the absence of loops):
+The compiler generates very verbose code:
 
-    $ ./text.py Hello World! | ./bf | opt -O3 -S
-    ; ModuleID = '<stdin>'
-    target datalayout = "e"
+    $ ./text.py Hello World! | ./bf
+    ...
 
-    ; Function Attrs: nounwind
-    declare i32 @putchar(i8) #0
+    define void @_start() {
+    entry:
+        ; initialization
+        %mem = alloca [30000 x i8]
+        %idx = alloca i32
+        %0 = bitcast [30000 x i8]* %mem to i8*
+        call void @llvm.memset.p0i8.i32(i8* %0, i8 0, i32 30000, i32 0, i1 false)
+        store i32 0, i32* %idx
+
+        ; command: +
+        %1 = load i32* %idx
+        %2 = getelementptr inbounds [30000 x i8]* %mem, i32 0, i32 %1
+        %3 = load i8* %2
+        %4 = add i8 %3, 1
+        %5 = load i32* %idx
+        %6 = getelementptr inbounds [30000 x i8]* %mem, i32 0, i32 %5
+        store i8 %4, i8* %6
+
+        ; command: +
+        %7 = load i32* %idx
+        %8 = getelementptr inbounds [30000 x i8]* %mem, i32 0, i32 %7
+        %9 = load i8* %8
+        %10 = add i8 %9, 1
+        %11 = load i32* %idx
+        %12 = getelementptr inbounds [30000 x i8]* %mem, i32 0, i32 %11
+        store i8 %10, i8* %12
+
+        ...
+
+        ; command: .
+        %433 = load i32* %idx
+        %434 = getelementptr inbounds [30000 x i8]* %mem, i32 0, i32 %433
+        %435 = load i8* %434
+        %436 = call i32 @putchar(i8 %435)
+
+        ...
+
+        call void @exit(i32 0)
+        ret void
+    }
 
-    declare void @exit(i32)
+The LLVM optimization engine is able to completely optimize away array accesses
+using constant propagation/folding. In the absence of loops, this effectively
+evaluates the whole program at compile time:
 
+    $ ./text.py Hello World! | ./bf | opt -O3 -S
+    ...
     define void @_start() {
     entry:
         %0 = tail call i32 @putchar(i8 72)
@@ -88,6 +128,3 @@ The LLVM optimization engine is able to completely optimize away array accesses
         tail call void @exit(i32 0)
         ret void
     }
-
-    attributes #0 = { nounwind }
-