Skip to content

Commit

Permalink
Do not generate assumes for plain integer casts
Browse files Browse the repository at this point in the history
  • Loading branch information
nagisa committed Aug 12, 2018
1 parent 0aa8d03 commit dc02a60
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/librustc_codegen_llvm/mir/rvalue.rs
Expand Up @@ -304,7 +304,9 @@ impl FunctionCx<'a, 'll, 'tcx> {
// then `i1 1` (i.e. E::B) is effectively `i8 -1`.
signed = !scalar.is_bool() && s;

if scalar.valid_range.end() > scalar.valid_range.start() {
let er = scalar.valid_range_exclusive(bx.cx);
if er.end != er.start &&
scalar.valid_range.end() > scalar.valid_range.start() {
// We want `table[e as usize]` to not
// have bound checks, and this is the most
// convenient place to put the `assume`.
Expand Down
11 changes: 10 additions & 1 deletion src/librustc_target/abi/mod.rs
Expand Up @@ -596,7 +596,16 @@ pub struct Scalar {
pub value: Primitive,

/// Inclusive wrap-around range of valid values, that is, if
/// min > max, it represents min..=u128::MAX followed by 0..=max.
/// start > end, it represents `start..=max_value()`,
/// followed by `0..=end`.
///
/// That is, for an i8 primitive, a range of `254..=2` means following
/// sequence:
///
/// 254 (-2), 255 (-1), 0, 1, 2
///
/// This is intended specifically to mirror LLVM’s `!range` metadata,
/// semantics.
// FIXME(eddyb) always use the shortest range, e.g. by finding
// the largest space between two consecutive valid values and
// taking everything else as the (shortest) valid range.
Expand Down
29 changes: 29 additions & 0 deletions src/test/codegen/no-assumes-on-casts.rs
@@ -0,0 +1,29 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![crate_type = "lib"]

// compile-flags: -Cno-prepopulate-passes

// CHECK-LABEL: fna
#[no_mangle]
pub fn fna(a: i16) -> i32 {
a as i32
// CHECK-NOT: assume
// CHECK: sext
}

// CHECK-LABEL: fnb
#[no_mangle]
pub fn fnb(a: u16) -> u32 {
a as u32
// CHECK-NOT: assume
// CHECK: zext
}

0 comments on commit dc02a60

Please sign in to comment.