Literals should probably be represented in high-precision, with literal arithmetic evaluated outside of LLVM, and only the result used as an LLVM constant.
Currently lit_int is represented by an int, making -2147483648 (or the 64-bit equivalent) lossy. The machine ints are all represented by int. For u32, i64, and u64, this is not enough. For i32, the problem mentioned above still comes up.