Improve optimizations for booleans value

LLVM doesn't handle i1 value in allocas/memory very well and skips a number of optimizations is it hits it. So we have to do the same thing that Clang does, using i1 for SSA values, but storing i8 in memory.