Do not generate assumes for plain integer casts
This commit is contained in:
parent
0aa8d03202
commit
dc02a6070f
@ -304,7 +304,9 @@ pub fn codegen_rvalue_operand(&mut self,
|
||||
// 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`.
|
||||
|
@ -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.
|
||||
|
29
src/test/codegen/no-assumes-on-casts.rs
Normal file
29
src/test/codegen/no-assumes-on-casts.rs
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user