I recently wrote a brainfuck compiler using Rust [0], but I targeted x86-64 asm directly. I implemented some very basic optimization (as you show at the bottom of your post), but I'd imagine llvm is able to take things much further. I'd be curious to see a performance comparison.
State of the art compilers are ridiculously clever sometimes, so I imagine quite a lot.
I wonder how good they are at extracting information from code generated from BF however.
So why did he use gcc to link the program at the end?
GCC is a front-end: in this case, it should just call ld.
Because he wrote a compiler but not a linker?
gcc is probably used to call the platforms linker
I imagine it is because gcc -o is a convenient way to call the linker such that it correctly links the binary and libc. Doing this manually with ld would require several (non-portable) command line arguments that would be distracting from the main point of the post.