That's strange, I have this testcase which vectorizes in glorious fashion. Only obvious difference is integer vs. float.
#[bench]
fn zipdot_checked_counted_loop(b: &mut test::Bencher)
{
let xs = vec![0; 1024];
let ys = vec![0; 768];
let xs = black_box(xs);
let ys = black_box(ys);
b.iter(|| {
// Must slice to equal lengths, and then bounds checks are eliminated!
let len = cmp::min(xs.len(), ys.len());
let xs = &xs[..len];
let ys = &ys[..len];
let mut s = 0;
for i in 0..len {
let x = xs[i];
let y = ys[i];
s += x * y;
}
s
})
}