Personally, I'd expect a compiler to take it one step further than what was suggested here.
For example, clang or gcc (under -O1) will precompute all of the math in that for-loop, and the entire function just becomes the printf with a known value.
define i32 @main() nounwind uwtable ssp {
%1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i64 500000000500000000) nounwind
ret i32 0
}