pub fn mul1(mut a: i32, b:i32) -> i32 {
let mut out = 0;
while a != 0 {
out += b;
a-=1;
}
out
}
pub fn mul2(a: i32, b: i32) -> i32 {
if a == 0 {
0
} else {
b + mul2(a-1, b)
}
}
Both are optimized to imul. But that's not actually correct: neither of these should terminate for negative a!Incidentally, this is actually a rust bug, caused by LLVM performing this optimization despite it being illegal in rust.