mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Rollup merge of #62801 - bjorn3:remove_lower_128bit_ops, r=alexcrichton
Remove support for -Zlower-128bit-ops It is broken and unused cc https://github.com/rust-lang/rust/issues/58969 blocked https://github.com/rust-lang-nursery/compiler-builtins/pull/302 (removes definitions of the lang items removed in this PR) r? @alexcrichton
This commit is contained in:
commit
632ce7402f
38
Cargo.lock
38
Cargo.lock
@ -17,7 +17,7 @@ dependencies = [
|
||||
name = "alloc"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
"rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -110,7 +110,7 @@ dependencies = [
|
||||
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"backtrace-sys 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
@ -122,7 +122,7 @@ version = "0.1.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
]
|
||||
@ -331,7 +331,7 @@ name = "cfg-if"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
]
|
||||
|
||||
@ -460,7 +460,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "compiler_builtins"
|
||||
version = "0.1.17"
|
||||
version = "0.1.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -791,7 +791,7 @@ name = "dlmalloc"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
]
|
||||
@ -956,7 +956,7 @@ name = "fortanix-sgx-abi"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
]
|
||||
|
||||
@ -1133,7 +1133,7 @@ name = "hashbrown"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-alloc 1.0.0",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
]
|
||||
@ -1951,7 +1951,7 @@ dependencies = [
|
||||
name = "panic_abort"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@ -1962,7 +1962,7 @@ version = "0.0.0"
|
||||
dependencies = [
|
||||
"alloc 0.0.0",
|
||||
"cfg-if 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unwind 0.0.0",
|
||||
@ -2133,7 +2133,7 @@ name = "profiler_builtins"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
]
|
||||
|
||||
@ -2670,7 +2670,7 @@ name = "rustc-demangle"
|
||||
version = "0.1.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-std-workspace-core 1.0.0",
|
||||
]
|
||||
|
||||
@ -2762,7 +2762,7 @@ dependencies = [
|
||||
"alloc 0.0.0",
|
||||
"build_helper 0.1.0",
|
||||
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
]
|
||||
|
||||
@ -2984,7 +2984,7 @@ dependencies = [
|
||||
"alloc 0.0.0",
|
||||
"build_helper 0.1.0",
|
||||
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
]
|
||||
|
||||
@ -3047,7 +3047,7 @@ dependencies = [
|
||||
"alloc 0.0.0",
|
||||
"build_helper 0.1.0",
|
||||
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
]
|
||||
|
||||
@ -3165,7 +3165,7 @@ dependencies = [
|
||||
"alloc 0.0.0",
|
||||
"build_helper 0.1.0",
|
||||
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
]
|
||||
|
||||
@ -3472,7 +3472,7 @@ dependencies = [
|
||||
"backtrace 0.3.29 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
"dlmalloc 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fortanix-sgx-abi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -4099,7 +4099,7 @@ version = "0.0.0"
|
||||
dependencies = [
|
||||
"cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core 0.0.0",
|
||||
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@ -4313,7 +4313,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum colored 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b0aa3473e85a3161b59845d6096b289bb577874cafeaf75ea1b1beaa6572c7fc"
|
||||
"checksum commoncrypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007"
|
||||
"checksum commoncrypto-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fed34f46747aa73dfaa578069fd8279d2818ade2b55f38f22a9401c7f4083e2"
|
||||
"checksum compiler_builtins 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9b4731b9e701aefe9e6bd1e9173f30526661508f9aaadaa5caec25ddf95585"
|
||||
"checksum compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "ef1c086a06d6f52f9c0d50cacdc021bfb6034ddeec9fb7e62f099f13f65472f4"
|
||||
"checksum compiletest_rs 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "f40ecc9332b68270998995c00f8051ee856121764a0d3230e64c9efd059d27b6"
|
||||
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
|
||||
"checksum core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2640d6d0bf22e82bed1b73c6aef8d5dd31e5abe6666c57e6d45e2649f4f887"
|
||||
|
@ -367,34 +367,6 @@ language_item_table! {
|
||||
|
||||
DebugTraitLangItem, "debug_trait", debug_trait, Target::Trait;
|
||||
|
||||
// A lang item for each of the 128-bit operators we can optionally lower.
|
||||
I128AddFnLangItem, "i128_add", i128_add_fn, Target::Fn;
|
||||
U128AddFnLangItem, "u128_add", u128_add_fn, Target::Fn;
|
||||
I128SubFnLangItem, "i128_sub", i128_sub_fn, Target::Fn;
|
||||
U128SubFnLangItem, "u128_sub", u128_sub_fn, Target::Fn;
|
||||
I128MulFnLangItem, "i128_mul", i128_mul_fn, Target::Fn;
|
||||
U128MulFnLangItem, "u128_mul", u128_mul_fn, Target::Fn;
|
||||
I128DivFnLangItem, "i128_div", i128_div_fn, Target::Fn;
|
||||
U128DivFnLangItem, "u128_div", u128_div_fn, Target::Fn;
|
||||
I128RemFnLangItem, "i128_rem", i128_rem_fn, Target::Fn;
|
||||
U128RemFnLangItem, "u128_rem", u128_rem_fn, Target::Fn;
|
||||
I128ShlFnLangItem, "i128_shl", i128_shl_fn, Target::Fn;
|
||||
U128ShlFnLangItem, "u128_shl", u128_shl_fn, Target::Fn;
|
||||
I128ShrFnLangItem, "i128_shr", i128_shr_fn, Target::Fn;
|
||||
U128ShrFnLangItem, "u128_shr", u128_shr_fn, Target::Fn;
|
||||
// And overflow versions for the operators that are checkable.
|
||||
// While MIR calls these Checked*, they return (T,bool), not Option<T>.
|
||||
I128AddoFnLangItem, "i128_addo", i128_addo_fn, Target::Fn;
|
||||
U128AddoFnLangItem, "u128_addo", u128_addo_fn, Target::Fn;
|
||||
I128SuboFnLangItem, "i128_subo", i128_subo_fn, Target::Fn;
|
||||
U128SuboFnLangItem, "u128_subo", u128_subo_fn, Target::Fn;
|
||||
I128MuloFnLangItem, "i128_mulo", i128_mulo_fn, Target::Fn;
|
||||
U128MuloFnLangItem, "u128_mulo", u128_mulo_fn, Target::Fn;
|
||||
I128ShloFnLangItem, "i128_shlo", i128_shlo_fn, Target::Fn;
|
||||
U128ShloFnLangItem, "u128_shlo", u128_shlo_fn, Target::Fn;
|
||||
I128ShroFnLangItem, "i128_shro", i128_shro_fn, Target::Fn;
|
||||
U128ShroFnLangItem, "u128_shro", u128_shro_fn, Target::Fn;
|
||||
|
||||
// Align offset for stride != 1, must not panic.
|
||||
AlignOffsetLangItem, "align_offset", align_offset_fn, Target::Fn;
|
||||
|
||||
|
@ -1406,10 +1406,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
|
||||
saturating_float_casts: bool = (false, parse_bool, [TRACKED],
|
||||
"make float->int casts UB-free: numbers outside the integer type's range are clipped to \
|
||||
the max/min integer respectively, and NaN is mapped to 0"),
|
||||
lower_128bit_ops: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"rewrite operators on i128 and u128 into lang item calls (typically provided \
|
||||
by compiler-builtins) so codegen doesn't need to support them,
|
||||
overriding the default for the current target"),
|
||||
human_readable_cgu_names: bool = (false, parse_bool, [TRACKED],
|
||||
"generate human-readable, predictable names for codegen units"),
|
||||
dep_info_omit_d_target: bool = (false, parse_bool, [TRACKED],
|
||||
|
@ -21,7 +21,7 @@ use crate::middle::cstore::EncodedMetadata;
|
||||
use crate::middle::lang_items;
|
||||
use crate::middle::resolve_lifetime::{self, ObjectLifetimeDefault};
|
||||
use crate::middle::stability;
|
||||
use crate::mir::{self, Body, interpret, ProjectionKind};
|
||||
use crate::mir::{Body, interpret, ProjectionKind};
|
||||
use crate::mir::interpret::{ConstValue, Allocation, Scalar};
|
||||
use crate::ty::subst::{Kind, InternalSubsts, SubstsRef, Subst};
|
||||
use crate::ty::ReprOptions;
|
||||
@ -1297,40 +1297,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
self.get_lang_items(LOCAL_CRATE)
|
||||
}
|
||||
|
||||
/// Due to missing llvm support for lowering 128 bit math to software emulation
|
||||
/// (on some targets), the lowering can be done in MIR.
|
||||
///
|
||||
/// This function only exists until said support is implemented.
|
||||
pub fn is_binop_lang_item(&self, def_id: DefId) -> Option<(mir::BinOp, bool)> {
|
||||
let items = self.lang_items();
|
||||
let def_id = Some(def_id);
|
||||
if items.i128_add_fn() == def_id { Some((mir::BinOp::Add, false)) }
|
||||
else if items.u128_add_fn() == def_id { Some((mir::BinOp::Add, false)) }
|
||||
else if items.i128_sub_fn() == def_id { Some((mir::BinOp::Sub, false)) }
|
||||
else if items.u128_sub_fn() == def_id { Some((mir::BinOp::Sub, false)) }
|
||||
else if items.i128_mul_fn() == def_id { Some((mir::BinOp::Mul, false)) }
|
||||
else if items.u128_mul_fn() == def_id { Some((mir::BinOp::Mul, false)) }
|
||||
else if items.i128_div_fn() == def_id { Some((mir::BinOp::Div, false)) }
|
||||
else if items.u128_div_fn() == def_id { Some((mir::BinOp::Div, false)) }
|
||||
else if items.i128_rem_fn() == def_id { Some((mir::BinOp::Rem, false)) }
|
||||
else if items.u128_rem_fn() == def_id { Some((mir::BinOp::Rem, false)) }
|
||||
else if items.i128_shl_fn() == def_id { Some((mir::BinOp::Shl, false)) }
|
||||
else if items.u128_shl_fn() == def_id { Some((mir::BinOp::Shl, false)) }
|
||||
else if items.i128_shr_fn() == def_id { Some((mir::BinOp::Shr, false)) }
|
||||
else if items.u128_shr_fn() == def_id { Some((mir::BinOp::Shr, false)) }
|
||||
else if items.i128_addo_fn() == def_id { Some((mir::BinOp::Add, true)) }
|
||||
else if items.u128_addo_fn() == def_id { Some((mir::BinOp::Add, true)) }
|
||||
else if items.i128_subo_fn() == def_id { Some((mir::BinOp::Sub, true)) }
|
||||
else if items.u128_subo_fn() == def_id { Some((mir::BinOp::Sub, true)) }
|
||||
else if items.i128_mulo_fn() == def_id { Some((mir::BinOp::Mul, true)) }
|
||||
else if items.u128_mulo_fn() == def_id { Some((mir::BinOp::Mul, true)) }
|
||||
else if items.i128_shlo_fn() == def_id { Some((mir::BinOp::Shl, true)) }
|
||||
else if items.u128_shlo_fn() == def_id { Some((mir::BinOp::Shl, true)) }
|
||||
else if items.i128_shro_fn() == def_id { Some((mir::BinOp::Shr, true)) }
|
||||
else if items.u128_shro_fn() == def_id { Some((mir::BinOp::Shr, true)) }
|
||||
else { None }
|
||||
}
|
||||
|
||||
pub fn stability(self) -> &'tcx stability::Index<'tcx> {
|
||||
self.stability_index(LOCAL_CRATE)
|
||||
}
|
||||
|
@ -230,21 +230,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
&mut self,
|
||||
instance: ty::Instance<'tcx>,
|
||||
args: &[OpTy<'tcx, M::PointerTag>],
|
||||
dest: Option<PlaceTy<'tcx, M::PointerTag>>,
|
||||
_dest: Option<PlaceTy<'tcx, M::PointerTag>>,
|
||||
) -> InterpResult<'tcx, bool> {
|
||||
let def_id = instance.def_id();
|
||||
// Some fn calls are actually BinOp intrinsics
|
||||
if let Some((op, oflo)) = self.tcx.is_binop_lang_item(def_id) {
|
||||
let dest = dest.expect("128 lowerings can't diverge");
|
||||
let l = self.read_immediate(args[0])?;
|
||||
let r = self.read_immediate(args[1])?;
|
||||
if oflo {
|
||||
self.binop_with_overflow(op, l, r, dest)?;
|
||||
} else {
|
||||
self.binop_ignore_overflow(op, l, r, dest)?;
|
||||
}
|
||||
return Ok(true);
|
||||
} else if Some(def_id) == self.tcx.lang_items().panic_fn() {
|
||||
if Some(def_id) == self.tcx.lang_items().panic_fn() {
|
||||
assert!(args.len() == 1);
|
||||
// &(&'static str, &'static str, u32, u32)
|
||||
let place = self.deref_operand(args[0])?;
|
||||
|
@ -232,13 +232,6 @@ impl Inliner<'tcx> {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Do not inline {u,i}128 lang items, codegen const eval depends
|
||||
// on detecting calls to these lang items and intercepting them
|
||||
if tcx.is_binop_lang_item(callsite.callee).is_some() {
|
||||
debug!(" not inlining 128bit integer lang item");
|
||||
return false;
|
||||
}
|
||||
|
||||
let codegen_fn_attrs = tcx.codegen_fn_attrs(callsite.callee);
|
||||
|
||||
let hinted = match codegen_fn_attrs.inline {
|
||||
|
@ -1,230 +0,0 @@
|
||||
//! Replaces 128-bit operators with lang item calls
|
||||
|
||||
use rustc::hir::def_id::DefId;
|
||||
use rustc::middle::lang_items::LangItem;
|
||||
use rustc::mir::*;
|
||||
use rustc::ty::{self, List, Ty, TyCtxt};
|
||||
use rustc_data_structures::indexed_vec::{Idx};
|
||||
use crate::transform::{MirPass, MirSource};
|
||||
|
||||
pub struct Lower128Bit;
|
||||
|
||||
impl MirPass for Lower128Bit {
|
||||
fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let debugging_override = tcx.sess.opts.debugging_opts.lower_128bit_ops;
|
||||
let target_default = tcx.sess.host.options.i128_lowering;
|
||||
if !debugging_override.unwrap_or(target_default) {
|
||||
return
|
||||
}
|
||||
|
||||
self.lower_128bit_ops(tcx, body);
|
||||
}
|
||||
}
|
||||
|
||||
impl Lower128Bit {
|
||||
fn lower_128bit_ops<'tcx>(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
let mut new_blocks = Vec::new();
|
||||
let cur_len = body.basic_blocks().len();
|
||||
|
||||
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
|
||||
for block in basic_blocks.iter_mut() {
|
||||
for i in (0..block.statements.len()).rev() {
|
||||
let (lang_item, rhs_kind) =
|
||||
if let Some((lang_item, rhs_kind)) =
|
||||
lower_to(&block.statements[i], local_decls, tcx)
|
||||
{
|
||||
(lang_item, rhs_kind)
|
||||
} else {
|
||||
continue;
|
||||
};
|
||||
|
||||
let rhs_override_ty = rhs_kind.ty(tcx);
|
||||
let cast_local =
|
||||
match rhs_override_ty {
|
||||
None => None,
|
||||
Some(ty) => {
|
||||
let local_decl = LocalDecl::new_internal(
|
||||
ty, block.statements[i].source_info.span);
|
||||
Some(local_decls.push(local_decl))
|
||||
},
|
||||
};
|
||||
|
||||
let storage_dead = cast_local.map(|local| {
|
||||
Statement {
|
||||
source_info: block.statements[i].source_info,
|
||||
kind: StatementKind::StorageDead(local),
|
||||
}
|
||||
});
|
||||
let after_call = BasicBlockData {
|
||||
statements: storage_dead.into_iter()
|
||||
.chain(block.statements.drain((i+1)..)).collect(),
|
||||
is_cleanup: block.is_cleanup,
|
||||
terminator: block.terminator.take(),
|
||||
};
|
||||
|
||||
let bin_statement = block.statements.pop().unwrap();
|
||||
let source_info = bin_statement.source_info;
|
||||
let (place, lhs, mut rhs) = match bin_statement.kind {
|
||||
StatementKind::Assign(place, box rvalue) => {
|
||||
match rvalue {
|
||||
Rvalue::BinaryOp(_, lhs, rhs)
|
||||
| Rvalue::CheckedBinaryOp(_, lhs, rhs) => (place, lhs, rhs),
|
||||
_ => bug!(),
|
||||
}
|
||||
}
|
||||
_ => bug!()
|
||||
};
|
||||
|
||||
if let Some(local) = cast_local {
|
||||
block.statements.push(Statement {
|
||||
source_info: source_info,
|
||||
kind: StatementKind::StorageLive(local),
|
||||
});
|
||||
block.statements.push(Statement {
|
||||
source_info: source_info,
|
||||
kind: StatementKind::Assign(
|
||||
Place::from(local),
|
||||
box Rvalue::Cast(
|
||||
CastKind::Misc,
|
||||
rhs,
|
||||
rhs_override_ty.unwrap())),
|
||||
});
|
||||
rhs = Operand::Move(Place::from(local));
|
||||
}
|
||||
|
||||
let call_did = check_lang_item_type(
|
||||
lang_item, &place, &lhs, &rhs, local_decls, tcx);
|
||||
|
||||
let bb = BasicBlock::new(cur_len + new_blocks.len());
|
||||
new_blocks.push(after_call);
|
||||
|
||||
block.terminator =
|
||||
Some(Terminator {
|
||||
source_info,
|
||||
kind: TerminatorKind::Call {
|
||||
func: Operand::function_handle(tcx, call_did,
|
||||
List::empty(), source_info.span),
|
||||
args: vec![lhs, rhs],
|
||||
destination: Some((place, bb)),
|
||||
cleanup: None,
|
||||
from_hir_call: false,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
basic_blocks.extend(new_blocks);
|
||||
}
|
||||
}
|
||||
|
||||
fn check_lang_item_type<'tcx, D>(
|
||||
lang_item: LangItem,
|
||||
place: &Place<'tcx>,
|
||||
lhs: &Operand<'tcx>,
|
||||
rhs: &Operand<'tcx>,
|
||||
local_decls: &D,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> DefId
|
||||
where
|
||||
D: HasLocalDecls<'tcx>,
|
||||
{
|
||||
let did = tcx.require_lang_item(lang_item);
|
||||
let poly_sig = tcx.fn_sig(did);
|
||||
let sig = poly_sig.no_bound_vars().unwrap();
|
||||
let lhs_ty = lhs.ty(local_decls, tcx);
|
||||
let rhs_ty = rhs.ty(local_decls, tcx);
|
||||
let place_ty = place.ty(local_decls, tcx).ty;
|
||||
let expected = [lhs_ty, rhs_ty, place_ty];
|
||||
assert_eq!(sig.inputs_and_output[..], expected,
|
||||
"lang item `{}`", tcx.def_path_str(did));
|
||||
did
|
||||
}
|
||||
|
||||
fn lower_to<'tcx, D>(
|
||||
statement: &Statement<'tcx>,
|
||||
local_decls: &D,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> Option<(LangItem, RhsKind)>
|
||||
where
|
||||
D: HasLocalDecls<'tcx>,
|
||||
{
|
||||
match statement.kind {
|
||||
StatementKind::Assign(_, box Rvalue::BinaryOp(bin_op, ref lhs, _)) => {
|
||||
let ty = lhs.ty(local_decls, tcx);
|
||||
if let Some(is_signed) = sign_of_128bit(ty) {
|
||||
return item_for_op(bin_op, is_signed);
|
||||
}
|
||||
},
|
||||
StatementKind::Assign(_, box Rvalue::CheckedBinaryOp(bin_op, ref lhs, _)) => {
|
||||
let ty = lhs.ty(local_decls, tcx);
|
||||
if let Some(is_signed) = sign_of_128bit(ty) {
|
||||
return item_for_checked_op(bin_op, is_signed);
|
||||
}
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
enum RhsKind {
|
||||
Unchanged,
|
||||
ForceU128,
|
||||
ForceU32,
|
||||
}
|
||||
|
||||
impl RhsKind {
|
||||
fn ty<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Option<Ty<'tcx>> {
|
||||
match *self {
|
||||
RhsKind::Unchanged => None,
|
||||
RhsKind::ForceU128 => Some(tcx.types.u128),
|
||||
RhsKind::ForceU32 => Some(tcx.types.u32),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn sign_of_128bit(ty: Ty<'_>) -> Option<bool> {
|
||||
match ty.sty {
|
||||
ty::Int(syntax::ast::IntTy::I128) => Some(true),
|
||||
ty::Uint(syntax::ast::UintTy::U128) => Some(false),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn item_for_op(bin_op: BinOp, is_signed: bool) -> Option<(LangItem, RhsKind)> {
|
||||
let i = match (bin_op, is_signed) {
|
||||
(BinOp::Add, true) => (LangItem::I128AddFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Add, false) => (LangItem::U128AddFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Sub, true) => (LangItem::I128SubFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Sub, false) => (LangItem::U128SubFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Mul, true) => (LangItem::I128MulFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Mul, false) => (LangItem::U128MulFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Div, true) => (LangItem::I128DivFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Div, false) => (LangItem::U128DivFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Rem, true) => (LangItem::I128RemFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Rem, false) => (LangItem::U128RemFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Shl, true) => (LangItem::I128ShlFnLangItem, RhsKind::ForceU32),
|
||||
(BinOp::Shl, false) => (LangItem::U128ShlFnLangItem, RhsKind::ForceU32),
|
||||
(BinOp::Shr, true) => (LangItem::I128ShrFnLangItem, RhsKind::ForceU32),
|
||||
(BinOp::Shr, false) => (LangItem::U128ShrFnLangItem, RhsKind::ForceU32),
|
||||
_ => return None,
|
||||
};
|
||||
Some(i)
|
||||
}
|
||||
|
||||
fn item_for_checked_op(bin_op: BinOp, is_signed: bool) -> Option<(LangItem, RhsKind)> {
|
||||
let i = match (bin_op, is_signed) {
|
||||
(BinOp::Add, true) => (LangItem::I128AddoFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Add, false) => (LangItem::U128AddoFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Sub, true) => (LangItem::I128SuboFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Sub, false) => (LangItem::U128SuboFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Mul, true) => (LangItem::I128MuloFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Mul, false) => (LangItem::U128MuloFnLangItem, RhsKind::Unchanged),
|
||||
(BinOp::Shl, true) => (LangItem::I128ShloFnLangItem, RhsKind::ForceU128),
|
||||
(BinOp::Shl, false) => (LangItem::U128ShloFnLangItem, RhsKind::ForceU128),
|
||||
(BinOp::Shr, true) => (LangItem::I128ShroFnLangItem, RhsKind::ForceU128),
|
||||
(BinOp::Shr, false) => (LangItem::U128ShroFnLangItem, RhsKind::ForceU128),
|
||||
_ => bug!("That should be all the checked ones?"),
|
||||
};
|
||||
Some(i)
|
||||
}
|
@ -34,7 +34,6 @@ pub mod copy_prop;
|
||||
pub mod const_prop;
|
||||
pub mod generator;
|
||||
pub mod inline;
|
||||
pub mod lower_128bit;
|
||||
pub mod uniform_array_move_out;
|
||||
|
||||
pub(crate) fn provide(providers: &mut Providers<'_>) {
|
||||
@ -272,8 +271,6 @@ fn optimized_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &Body<'_> {
|
||||
// From here on out, regions are gone.
|
||||
&erase_regions::EraseRegions,
|
||||
|
||||
&lower_128bit::Lower128Bit,
|
||||
|
||||
|
||||
// Optimizations begin.
|
||||
&uniform_array_move_out::RestoreSubsliceArrayMoveOut,
|
||||
|
@ -736,10 +736,6 @@ pub struct TargetOptions {
|
||||
/// for this target unconditionally.
|
||||
pub no_builtins: bool,
|
||||
|
||||
/// Whether to lower 128-bit operations to compiler_builtins calls. Use if
|
||||
/// your backend only supports 64-bit and smaller math.
|
||||
pub i128_lowering: bool,
|
||||
|
||||
/// The codegen backend to use for this target, typically "llvm"
|
||||
pub codegen_backend: String,
|
||||
|
||||
@ -855,7 +851,6 @@ impl Default for TargetOptions {
|
||||
requires_lto: false,
|
||||
singlethread: false,
|
||||
no_builtins: false,
|
||||
i128_lowering: false,
|
||||
codegen_backend: "llvm".to_string(),
|
||||
default_hidden_visibility: false,
|
||||
embed_bitcode: false,
|
||||
|
@ -1,226 +0,0 @@
|
||||
// asmjs can't even pass i128 as arguments or return values, so ignore it.
|
||||
// this will hopefully be fixed by the LLVM 5 upgrade (#43370)
|
||||
// ignore-asmjs
|
||||
// ignore-emscripten
|
||||
|
||||
// compile-flags: -Z lower_128bit_ops=yes -C debug_assertions=yes
|
||||
|
||||
static TEST_SIGNED: i128 = const_signed(-222);
|
||||
static TEST_UNSIGNED: u128 = const_unsigned(200);
|
||||
|
||||
const fn const_signed(mut x: i128) -> i128 {
|
||||
((((((x + 1) - 2) * 3) / 4) % 5) << 6) >> 7
|
||||
}
|
||||
|
||||
const fn const_unsigned(mut x: u128) -> u128 {
|
||||
((((((x + 1) - 2) * 3) / 4) % 5) << 6) >> 7
|
||||
}
|
||||
|
||||
fn test_signed(mut x: i128) -> i128 {
|
||||
x += 1;
|
||||
x -= 2;
|
||||
x *= 3;
|
||||
x /= 4;
|
||||
x %= 5;
|
||||
x <<= 6;
|
||||
x >>= 7;
|
||||
x
|
||||
}
|
||||
|
||||
fn test_unsigned(mut x: u128) -> u128 {
|
||||
x += 1;
|
||||
x -= 2;
|
||||
x *= 3;
|
||||
x /= 4;
|
||||
x %= 5;
|
||||
x <<= 6;
|
||||
x >>= 7;
|
||||
x
|
||||
}
|
||||
|
||||
fn check(x: i128, y: u128) {
|
||||
assert_eq!(test_signed(x), -1);
|
||||
assert_eq!(const_signed(x), -1);
|
||||
assert_eq!(TEST_SIGNED, -1);
|
||||
assert_eq!(test_unsigned(y), 2);
|
||||
assert_eq!(const_unsigned(y), 2);
|
||||
assert_eq!(TEST_UNSIGNED, 2);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
check(-222, 200);
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
|
||||
// START rustc.const_signed.Lower128Bit.after.mir
|
||||
// _8 = _1;
|
||||
// _9 = const compiler_builtins::int::addsub::rust_i128_addo(move _8, const 1i128) -> bb10;
|
||||
// ...
|
||||
// _7 = move (_9.0: i128);
|
||||
// ...
|
||||
// _10 = const compiler_builtins::int::addsub::rust_i128_subo(move _7, const 2i128) -> bb11;
|
||||
// ...
|
||||
// _6 = move (_10.0: i128);
|
||||
// ...
|
||||
// _11 = const compiler_builtins::int::mul::rust_i128_mulo(move _6, const 3i128) -> bb12;
|
||||
// ...
|
||||
// _5 = move (_11.0: i128);
|
||||
// ...
|
||||
// _12 = Eq(const 4i128, const 0i128);
|
||||
// assert(!move _12, "attempt to divide by zero") -> bb4;
|
||||
// ...
|
||||
// _13 = Eq(const 4i128, const -1i128);
|
||||
// _14 = Eq(_5, const -170141183460469231731687303715884105728i128);
|
||||
// _15 = BitAnd(move _13, move _14);
|
||||
// assert(!move _15, "attempt to divide with overflow") -> bb5;
|
||||
// ...
|
||||
// _4 = const compiler_builtins::int::sdiv::rust_i128_div(move _5, const 4i128) -> bb13;
|
||||
// ...
|
||||
// _17 = Eq(const 5i128, const -1i128);
|
||||
// _18 = Eq(_4, const -170141183460469231731687303715884105728i128);
|
||||
// _19 = BitAnd(move _17, move _18);
|
||||
// assert(!move _19, "attempt to calculate the remainder with overflow") -> bb7;
|
||||
// ...
|
||||
// _3 = const compiler_builtins::int::sdiv::rust_i128_rem(move _4, const 5i128) -> bb15;
|
||||
// ...
|
||||
// _2 = move (_20.0: i128);
|
||||
// ...
|
||||
// _23 = const 7i32 as u128 (Misc);
|
||||
// _21 = const compiler_builtins::int::shift::rust_i128_shro(move _2, move _23) -> bb16;
|
||||
// ...
|
||||
// _0 = move (_21.0: i128);
|
||||
// ...
|
||||
// assert(!move (_9.1: bool), "attempt to add with overflow") -> bb1;
|
||||
// ...
|
||||
// assert(!move (_10.1: bool), "attempt to subtract with overflow") -> bb2;
|
||||
// ...
|
||||
// assert(!move (_11.1: bool), "attempt to multiply with overflow") -> bb3;
|
||||
// ...
|
||||
// _16 = Eq(const 5i128, const 0i128);
|
||||
// assert(!move _16, "attempt to calculate the remainder with a divisor of zero") -> bb6;
|
||||
// ...
|
||||
// assert(!move (_20.1: bool), "attempt to shift left with overflow") -> bb8;
|
||||
// ...
|
||||
// _22 = const 6i32 as u128 (Misc);
|
||||
// _20 = const compiler_builtins::int::shift::rust_i128_shlo(move _3, move _22) -> bb14;
|
||||
// ...
|
||||
// assert(!move (_21.1: bool), "attempt to shift right with overflow") -> bb9;
|
||||
// END rustc.const_signed.Lower128Bit.after.mir
|
||||
|
||||
// START rustc.const_unsigned.Lower128Bit.after.mir
|
||||
// _8 = _1;
|
||||
// _9 = const compiler_builtins::int::addsub::rust_u128_addo(move _8, const 1u128) -> bb8;
|
||||
// ...
|
||||
// _7 = move (_9.0: u128);
|
||||
// ...
|
||||
// _10 = const compiler_builtins::int::addsub::rust_u128_subo(move _7, const 2u128) -> bb9;
|
||||
// ...
|
||||
// _6 = move (_10.0: u128);
|
||||
// ...
|
||||
// _11 = const compiler_builtins::int::mul::rust_u128_mulo(move _6, const 3u128) -> bb10;
|
||||
// ...
|
||||
// _5 = move (_11.0: u128);
|
||||
// ...
|
||||
// _12 = Eq(const 4u128, const 0u128);
|
||||
// assert(!move _12, "attempt to divide by zero") -> bb4;
|
||||
// ...
|
||||
// _4 = const compiler_builtins::int::udiv::rust_u128_div(move _5, const 4u128) -> bb11;
|
||||
// ...
|
||||
// _3 = const compiler_builtins::int::udiv::rust_u128_rem(move _4, const 5u128) -> bb13;
|
||||
// ...
|
||||
// _2 = move (_14.0: u128);
|
||||
// ...
|
||||
// _17 = const 7i32 as u128 (Misc);
|
||||
// _15 = const compiler_builtins::int::shift::rust_u128_shro(move _2, move _17) -> bb14;
|
||||
// ...
|
||||
// _0 = move (_15.0: u128);
|
||||
// ...
|
||||
// assert(!move (_9.1: bool), "attempt to add with overflow") -> bb1;
|
||||
// ...
|
||||
// assert(!move (_10.1: bool), "attempt to subtract with overflow") -> bb2;
|
||||
// ...
|
||||
// assert(!move (_11.1: bool), "attempt to multiply with overflow") -> bb3;
|
||||
// ...
|
||||
// _13 = Eq(const 5u128, const 0u128);
|
||||
// assert(!move _13, "attempt to calculate the remainder with a divisor of zero") -> bb5;
|
||||
// ...
|
||||
// assert(!move (_14.1: bool), "attempt to shift left with overflow") -> bb6;
|
||||
// ...
|
||||
// _16 = const 6i32 as u128 (Misc);
|
||||
// _14 = const compiler_builtins::int::shift::rust_u128_shlo(move _3, move _16) -> bb12;
|
||||
// ...
|
||||
// assert(!move (_15.1: bool), "attempt to shift right with overflow") -> bb7;
|
||||
// END rustc.const_unsigned.Lower128Bit.after.mir
|
||||
|
||||
// START rustc.test_signed.Lower128Bit.after.mir
|
||||
// _2 = const compiler_builtins::int::addsub::rust_i128_addo(_1, const 1i128) -> bb10;
|
||||
// ...
|
||||
// _1 = move (_2.0: i128);
|
||||
// _3 = const compiler_builtins::int::addsub::rust_i128_subo(_1, const 2i128) -> bb11;
|
||||
// ...
|
||||
// _1 = move (_3.0: i128);
|
||||
// _4 = const compiler_builtins::int::mul::rust_i128_mulo(_1, const 3i128) -> bb12;
|
||||
// ...
|
||||
// _1 = move (_4.0: i128);
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::sdiv::rust_i128_div(_1, const 4i128) -> bb13;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::sdiv::rust_i128_rem(_1, const 5i128) -> bb15;
|
||||
// ...
|
||||
// _1 = move (_13.0: i128);
|
||||
// ...
|
||||
// _16 = const 7i32 as u128 (Misc);
|
||||
// _14 = const compiler_builtins::int::shift::rust_i128_shro(_1, move _16) -> bb16;
|
||||
// ...
|
||||
// _1 = move (_14.0: i128);
|
||||
// ...
|
||||
// assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1;
|
||||
// ...
|
||||
// assert(!move (_3.1: bool), "attempt to subtract with overflow") -> bb2;
|
||||
// ...
|
||||
// assert(!move (_4.1: bool), "attempt to multiply with overflow") -> bb3;
|
||||
// ...
|
||||
// assert(!move (_13.1: bool), "attempt to shift left with overflow") -> bb8;
|
||||
// ...
|
||||
// _15 = const 6i32 as u128 (Misc);
|
||||
// _13 = const compiler_builtins::int::shift::rust_i128_shlo(_1, move _15) -> bb14;
|
||||
// ...
|
||||
// assert(!move (_14.1: bool), "attempt to shift right with overflow") -> bb9;
|
||||
// END rustc.test_signed.Lower128Bit.after.mir
|
||||
|
||||
// START rustc.test_unsigned.Lower128Bit.after.mir
|
||||
// _2 = const compiler_builtins::int::addsub::rust_u128_addo(_1, const 1u128) -> bb8;
|
||||
// ...
|
||||
// _1 = move (_2.0: u128);
|
||||
// _3 = const compiler_builtins::int::addsub::rust_u128_subo(_1, const 2u128) -> bb9;
|
||||
// ...
|
||||
// _1 = move (_3.0: u128);
|
||||
// _4 = const compiler_builtins::int::mul::rust_u128_mulo(_1, const 3u128) -> bb10;
|
||||
// ...
|
||||
// _1 = move (_4.0: u128);
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::udiv::rust_u128_div(_1, const 4u128) -> bb11;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::udiv::rust_u128_rem(_1, const 5u128) -> bb13;
|
||||
// ...
|
||||
// _1 = move (_7.0: u128);
|
||||
// ...
|
||||
// _10 = const 7i32 as u128 (Misc);
|
||||
// _8 = const compiler_builtins::int::shift::rust_u128_shro(_1, move _10) -> bb14;
|
||||
// ...
|
||||
// _1 = move (_8.0: u128);
|
||||
// ...
|
||||
// assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1;
|
||||
// ...
|
||||
// assert(!move (_3.1: bool), "attempt to subtract with overflow") -> bb2;
|
||||
// ...
|
||||
// assert(!move (_4.1: bool), "attempt to multiply with overflow") -> bb3;
|
||||
// ...
|
||||
// assert(!move (_7.1: bool), "attempt to shift left with overflow") -> bb6;
|
||||
// ...
|
||||
// _9 = const 6i32 as u128 (Misc);
|
||||
// _7 = const compiler_builtins::int::shift::rust_u128_shlo(_1, move _9) -> bb12;
|
||||
// ...
|
||||
// assert(!move (_8.1: bool), "attempt to shift right with overflow") -> bb7;
|
||||
// END rustc.test_unsigned.Lower128Bit.after.mir
|
@ -1,149 +0,0 @@
|
||||
// ignore-emscripten
|
||||
|
||||
// compile-flags: -Z lower_128bit_ops=yes -C debug_assertions=no -O
|
||||
|
||||
static TEST_SIGNED: i128 = const_signed(-222);
|
||||
static TEST_UNSIGNED: u128 = const_unsigned(200);
|
||||
|
||||
const fn const_signed(mut x: i128) -> i128 {
|
||||
((((((x + 1) - 2) * 3) / 4) % 5) << 6) >> 7
|
||||
}
|
||||
|
||||
const fn const_unsigned(mut x: u128) -> u128 {
|
||||
((((((x + 1) - 2) * 3) / 4) % 5) << 6) >> 7
|
||||
}
|
||||
|
||||
fn test_signed(mut x: i128) -> i128 {
|
||||
x += 1;
|
||||
x -= 2;
|
||||
x *= 3;
|
||||
x /= 4;
|
||||
x %= 5;
|
||||
x <<= 6;
|
||||
x >>= 7;
|
||||
x
|
||||
}
|
||||
|
||||
fn test_unsigned(mut x: u128) -> u128 {
|
||||
x += 1;
|
||||
x -= 2;
|
||||
x *= 3;
|
||||
x /= 4;
|
||||
x %= 5;
|
||||
x <<= 6;
|
||||
x >>= 7;
|
||||
x
|
||||
}
|
||||
|
||||
fn check(x: i128, y: u128) {
|
||||
assert_eq!(test_signed(x), -1);
|
||||
assert_eq!(const_signed(x), -1);
|
||||
assert_eq!(TEST_SIGNED, -1);
|
||||
assert_eq!(test_unsigned(y), 2);
|
||||
assert_eq!(const_unsigned(y), 2);
|
||||
assert_eq!(TEST_UNSIGNED, 2);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
check(-222, 200);
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
|
||||
// START rustc.const_signed.Lower128Bit.after.mir
|
||||
// _7 = const compiler_builtins::int::addsub::rust_i128_add(move _8, const 1i128) -> bb7;
|
||||
// ...
|
||||
// _10 = Eq(const 4i128, const -1i128);
|
||||
// _11 = Eq(_5, const -170141183460469231731687303715884105728i128);
|
||||
// _12 = BitAnd(move _10, move _11);
|
||||
// assert(!move _12, "attempt to divide with overflow") -> bb2;
|
||||
// ...
|
||||
// _4 = const compiler_builtins::int::sdiv::rust_i128_div(move _5, const 4i128) -> bb8;
|
||||
// ...
|
||||
// _14 = Eq(const 5i128, const -1i128);
|
||||
// _15 = Eq(_4, const -170141183460469231731687303715884105728i128);
|
||||
// _16 = BitAnd(move _14, move _15);
|
||||
// assert(!move _16, "attempt to calculate the remainder with overflow") -> bb4;
|
||||
// ...
|
||||
// _3 = const compiler_builtins::int::sdiv::rust_i128_rem(move _4, const 5i128) -> bb11;
|
||||
// ...
|
||||
// _9 = Eq(const 4i128, const 0i128);
|
||||
// assert(!move _9, "attempt to divide by zero") -> bb1;
|
||||
// ...
|
||||
// _5 = const compiler_builtins::int::mul::rust_i128_mul(move _6, const 3i128) -> bb5;
|
||||
// ...
|
||||
// _6 = const compiler_builtins::int::addsub::rust_i128_sub(move _7, const 2i128) -> bb6;
|
||||
// ...
|
||||
// _13 = Eq(const 5i128, const 0i128);
|
||||
// assert(!move _13, "attempt to calculate the remainder with a divisor of zero") -> bb3;
|
||||
// ...
|
||||
// _17 = const 7i32 as u32 (Misc);
|
||||
// _0 = const compiler_builtins::int::shift::rust_i128_shr(move _2, move _17) -> bb9;
|
||||
// ...
|
||||
// _18 = const 6i32 as u32 (Misc);
|
||||
// _2 = const compiler_builtins::int::shift::rust_i128_shl(move _3, move _18) -> bb10;
|
||||
// END rustc.const_signed.Lower128Bit.after.mir
|
||||
|
||||
// START rustc.const_unsigned.Lower128Bit.after.mir
|
||||
// _8 = _1;
|
||||
// _7 = const compiler_builtins::int::addsub::rust_u128_add(move _8, const 1u128) -> bb5;
|
||||
// ...
|
||||
// _4 = const compiler_builtins::int::udiv::rust_u128_div(move _5, const 4u128) -> bb6;
|
||||
// ...
|
||||
// _3 = const compiler_builtins::int::udiv::rust_u128_rem(move _4, const 5u128) -> bb9;
|
||||
// ...
|
||||
// _9 = Eq(const 4u128, const 0u128);
|
||||
// assert(!move _9, "attempt to divide by zero") -> bb1;
|
||||
// ...
|
||||
// _5 = const compiler_builtins::int::mul::rust_u128_mul(move _6, const 3u128) -> bb3;
|
||||
// ...
|
||||
// _6 = const compiler_builtins::int::addsub::rust_u128_sub(move _7, const 2u128) -> bb4;
|
||||
// ...
|
||||
// _10 = Eq(const 5u128, const 0u128);
|
||||
// assert(!move _10, "attempt to calculate the remainder with a divisor of zero") -> bb2;
|
||||
// ...
|
||||
// return;
|
||||
// ...
|
||||
// _11 = const 7i32 as u32 (Misc);
|
||||
// _0 = const compiler_builtins::int::shift::rust_u128_shr(move _2, move _11) -> bb7;
|
||||
// ...
|
||||
// _12 = const 6i32 as u32 (Misc);
|
||||
// _2 = const compiler_builtins::int::shift::rust_u128_shl(move _3, move _12) -> bb8;
|
||||
|
||||
// END rustc.const_unsigned.Lower128Bit.after.mir
|
||||
|
||||
// START rustc.test_signed.Lower128Bit.after.mir
|
||||
// _1 = const compiler_builtins::int::addsub::rust_i128_add(_1, const 1i128) -> bb7;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::sdiv::rust_i128_div(_1, const 4i128) -> bb8;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::sdiv::rust_i128_rem(_1, const 5i128) -> bb11;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::mul::rust_i128_mul(_1, const 3i128) -> bb5;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::addsub::rust_i128_sub(_1, const 2i128) -> bb6;
|
||||
// ...
|
||||
// _10 = const 7i32 as u32 (Misc);
|
||||
// _1 = const compiler_builtins::int::shift::rust_i128_shr(_1, move _10) -> bb9;
|
||||
// ...
|
||||
// _11 = const 6i32 as u32 (Misc);
|
||||
// _1 = const compiler_builtins::int::shift::rust_i128_shl(_1, move _11) -> bb10;
|
||||
// END rustc.test_signed.Lower128Bit.after.mir
|
||||
|
||||
// START rustc.test_unsigned.Lower128Bit.after.mir
|
||||
// _1 = const compiler_builtins::int::addsub::rust_u128_add(_1, const 1u128) -> bb5;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::udiv::rust_u128_div(_1, const 4u128) -> bb6;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::udiv::rust_u128_rem(_1, const 5u128) -> bb9;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::mul::rust_u128_mul(_1, const 3u128) -> bb3;
|
||||
// ...
|
||||
// _1 = const compiler_builtins::int::addsub::rust_u128_sub(_1, const 2u128) -> bb4;
|
||||
// ...
|
||||
// _4 = const 7i32 as u32 (Misc);
|
||||
// _1 = const compiler_builtins::int::shift::rust_u128_shr(_1, move _4) -> bb7;
|
||||
// ...
|
||||
// _5 = const 6i32 as u32 (Misc);
|
||||
// _1 = const compiler_builtins::int::shift::rust_u128_shl(_1, move _5) -> bb8;
|
||||
// END rustc.test_unsigned.Lower128Bit.after.mir
|
Loading…
Reference in New Issue
Block a user