bfc 1.12.0

An industrial-grade brainfuck compiler
declare i8* @calloc(i32)
declare void @free(i8*)
declare i32 @putchar(i32)
declare i32 @getchar()

; run with
; $ echo a | lli comma.ll
define i32 @main() nounwind {
       %cells = call i8* @calloc(i32 30000)
       %cell_index_ptr = alloca i32
       store i32 0, i32* %cell_index_ptr

       ; we implement the BF program ',.'
       
       %cell_index = load i32* %cell_index_ptr
       %cell_ptr = getelementptr i8* %cells, i32 %cell_index

       ; read a character from stdin and save it in the cell
       %input_int = call i32 @getchar()
       %input_byte = trunc i32 %input_int to i8
       store i8 %input_byte, i8* %cell_ptr

       ; print the current cell
       %current_cell = load i8* %cell_ptr
       %current_cell_word = sext i8 %current_cell to i32
       call i32 @putchar(i32 %current_cell_word)

       ret i32 0
}