Closed zachwolfe closed 3 years ago
loop sample mir (names cleaned up):
fn len(%str: u8*): usize {
%bbSTART:
%len_ptr = alloca usize
%zero = 0 as usize
store %zero in %len_ptr
br %bbCHECK
%bbCHECK:
%str_addr = reinterpret %str as usize
%len = load %len_ptr
%cur_char_addr = intrinsic `+`(%str_addr, %len)
%cur_char_ptr = reinterpret %cur_char_addr as u8*
%cur_char = load %cur_char_ptr
%zero.1 = 0 as u8
%condition = intrinsic `!=`(%cur_char, %zero.1)
condbr %condition, %bbBODY, %bbEND
%bbBODY:
%len.1 = load %len_ptr
%one = 1 as usize
%new_len = intrinsic `+`(%len.1, %one)
store %new_len in %len_ptr
br %bbCHECK
%bbEND:
%len.2 = load %len_ptr
return %len.2
}
New approach
@precondition
=>@requires
,@postcondition
=>@guarantees
(not yet)(<= 1 (+ a 1))
=>(<= 0 a)
(and some similar cases)(<= -2147483648 (- 2147483647 12))
@guarantees
constraints on the return valueOld approach