diff options
| author | Dániel Buga <bugadani@gmail.com> | 2020-08-30 21:26:03 +0200 |
|---|---|---|
| committer | Dániel Buga <bugadani@gmail.com> | 2020-08-31 08:19:15 +0200 |
| commit | c88b167f1518370833c9216706d09735d1e2d697 (patch) | |
| tree | 50924d0492e779e68afe4ed78ae4eff0f8bf32a6 | |
| parent | 85fbf49ce0e2274d0acf798f6e703747674feec3 (diff) | |
| download | rust-c88b167f1518370833c9216706d09735d1e2d697.tar.gz rust-c88b167f1518370833c9216706d09735d1e2d697.zip | |
Additional assumption to elide bounds check
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/rvalue.rs | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index 71f924df119..43521048012 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -327,13 +327,29 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { if er.end != er.start && scalar.valid_range.end() > scalar.valid_range.start() { - // We want `table[e as usize]` to not + // We want `table[e as usize ± k]` to not // have bound checks, and this is the most - // convenient place to put the `assume`. - let ll_t_in_const = + // convenient place to put the `assume`s. + if *scalar.valid_range.start() > 0 { + let enum_value_lower_bound = bx + .cx() + .const_uint_big(ll_t_in, *scalar.valid_range.start()); + let cmp_start = bx.icmp( + IntPredicate::IntUGE, + llval, + enum_value_lower_bound, + ); + bx.assume(cmp_start); + } + + let enum_value_upper_bound = bx.cx().const_uint_big(ll_t_in, *scalar.valid_range.end()); - let cmp = bx.icmp(IntPredicate::IntULE, llval, ll_t_in_const); - bx.assume(cmp); + let cmp_end = bx.icmp( + IntPredicate::IntULE, + llval, + enum_value_upper_bound, + ); + bx.assume(cmp_end); } } } |
