Skip to content
Snippets Groups Projects
Commit ddb09a9d authored by Taddeüs Kroes's avatar Taddeüs Kroes
Browse files

Extended optimization example

parent 4ad2e109
No related branches found
No related tags found
No related merge requests found
......@@ -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 }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment