Skip to content

Commit c88b167

Browse files
committed
Additional assumption to elide bounds check
1 parent 85fbf49 commit c88b167

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

compiler/rustc_codegen_ssa/src/mir/rvalue.rs

+21-5
Original file line numberDiff line numberDiff line change
@@ -327,13 +327,29 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
327327
if er.end != er.start
328328
&& scalar.valid_range.end() > scalar.valid_range.start()
329329
{
330-
// We want `table[e as usize]` to not
330+
// We want `table[e as usize ± k]` to not
331331
// have bound checks, and this is the most
332-
// convenient place to put the `assume`.
333-
let ll_t_in_const =
332+
// convenient place to put the `assume`s.
333+
if *scalar.valid_range.start() > 0 {
334+
let enum_value_lower_bound = bx
335+
.cx()
336+
.const_uint_big(ll_t_in, *scalar.valid_range.start());
337+
let cmp_start = bx.icmp(
338+
IntPredicate::IntUGE,
339+
llval,
340+
enum_value_lower_bound,
341+
);
342+
bx.assume(cmp_start);
343+
}
344+
345+
let enum_value_upper_bound =
334346
bx.cx().const_uint_big(ll_t_in, *scalar.valid_range.end());
335-
let cmp = bx.icmp(IntPredicate::IntULE, llval, ll_t_in_const);
336-
bx.assume(cmp);
347+
let cmp_end = bx.icmp(
348+
IntPredicate::IntULE,
349+
llval,
350+
enum_value_upper_bound,
351+
);
352+
bx.assume(cmp_end);
337353
}
338354
}
339355
}

0 commit comments

Comments
 (0)