vec: use `offset_inbounds` for iterators

This allows LLVM to optimize vector iterators to an `getelementptr` and
`icmp` pair, instead of `getelementptr` and *two* comparisons.

Code snippet:

~~~
fn main() {
    let mut xs = [0.0, ..100000];
    for x in xs.mut_iter() {
        *x += 10.0;
    }
}
~~~

LLVM IR at stage0:

~~~
define void @_rust_main({ i64, %tydesc*, i8*, i8*, i8 }* nocapture) {
"function top level":
  %xs.i = alloca [100000 x double], align 8
  %1 = bitcast [100000 x double]* %xs.i to i8*
  call void @llvm.lifetime.start(i64 800000, i8* %1)
  call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 800000, i32 8, i1 false)
  %2 = ptrtoint [100000 x double]* %xs.i to i64
  %3 = add i64 %2, 800000
  %.val.i.i = inttoptr i64 %3 to double*
  %4 = getelementptr inbounds [100000 x double]* %xs.i, i64 0, i64 0
  %5 = icmp eq double* %4, %.val.i.i
  br i1 %5, label %"_ZN4main17_15bec6257b8bff787_0$x2e0E.exit", label %match_else.i.preheader

match_else.i.preheader:                           ; preds = %"function top level"
  %6 = getelementptr [100000 x double]* %xs.i, i64 0, i64 1
  store double 1.000000e+01, double* %4, align 8
  %7 = icmp eq double* %6, %.val.i.i
  %8 = icmp eq double* %6, null
  %or.cond.i1 = or i1 %7, %8
  br i1 %or.cond.i1, label %"_ZN4main17_15bec6257b8bff787_0$x2e0E.exit", label %match_else.match_else_crit_edge.i

match_else.match_else_crit_edge.i:                ; preds = %match_else.i.preheader, %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge
  %.pre.i = phi double [ %phitmp, %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge ], [ 1.000000e+01, %match_else.i.preheader ]
  %9 = phi double* [ %10, %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge ], [ %6, %match_else.i.preheader ]
  %10 = getelementptr double* %9, i64 1
  store double %.pre.i, double* %9, align 8
  %11 = icmp eq double* %10, %.val.i.i
  %12 = icmp eq double* %10, null
  %or.cond.i = or i1 %11, %12
  br i1 %or.cond.i, label %"_ZN4main17_15bec6257b8bff787_0$x2e0E.exit", label %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge

match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge: ; preds = %match_else.match_else_crit_edge.i
  %.pre.i.pre = load double* %10, align 8
  %phitmp = fadd double %.pre.i.pre, 1.000000e+01
  br label %match_else.match_else_crit_edge.i

"_ZN4main17_15bec6257b8bff787_0$x2e0E.exit":      ; preds = %match_else.i.preheader, %match_else.match_else_crit_edge.i, %"function top level"
  call void @llvm.lifetime.end(i64 800000, i8* %1)
  ret void
}
~~~

Optimized LLVM IR at stage1:

~~~
define void @_rust_main({ i64, %tydesc*, i8*, i8*, i8 }* nocapture) {
match_else.match_else_crit_edge.i.lr.ph:
  %xs.i = alloca [100000 x double], align 8
  %1 = bitcast [100000 x double]* %xs.i to i8*
  call void @llvm.lifetime.start(i64 800000, i8* %1)
  call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 800000, i32 8, i1 false)
  %2 = getelementptr inbounds [100000 x double]* %xs.i, i64 0, i64 100000
  %3 = getelementptr inbounds [100000 x double]* %xs.i, i64 0, i64 0
  store double 1.000000e+01, double* %3, align 8
  %4 = getelementptr inbounds [100000 x double]* %xs.i, i64 0, i64 1
  br label %match_else.match_else_crit_edge.i

match_else.match_else_crit_edge.i:                ; preds = %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge, %match_else.match_else_crit_edge.i.lr.ph
  %.pre.i = phi double [ 1.000000e+01, %match_else.match_else_crit_edge.i.lr.ph ], [ %phitmp, %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge ]
  %5 = phi double* [ %4, %match_else.match_else_crit_edge.i.lr.ph ], [ %6, %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge ]
  %6 = getelementptr inbounds double* %5, i64 1
  store double %.pre.i, double* %5, align 8
  %7 = icmp eq double* %6, %2
  br i1 %7, label %"_ZN4main17_15bec6257b8bff787_0$x2e0E.exit", label %match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge

match_else.match_else_crit_edge.i.match_else.match_else_crit_edge.i_crit_edge: ; preds = %match_else.match_else_crit_edge.i
  %.pre.i.pre = load double* %6, align 8
  %phitmp = fadd double %.pre.i.pre, 1.000000e+01
  br label %match_else.match_else_crit_edge.i

"_ZN4main17_15bec6257b8bff787_0$x2e0E.exit":      ; preds = %match_else.match_else_crit_edge.i
  call void @llvm.lifetime.end(i64 800000, i8* %1)
  ret void
}
~~~