diff options
| author | bjorn3 <17426603+bjorn3@users.noreply.github.com> | 2022-12-13 18:34:08 +0100 |
|---|---|---|
| committer | bjorn3 <17426603+bjorn3@users.noreply.github.com> | 2022-12-22 14:02:47 +0000 |
| commit | debd45cc7be97c8a7c50c2822593471d04d87366 (patch) | |
| tree | ea03e07234eafd71ea73aaf4ff26f36a0d2f21f1 /src | |
| parent | 8b478012086f4df5c21e4ec0016631fac163133f (diff) | |
| download | rust-debd45cc7be97c8a7c50c2822593471d04d87366.tar.gz rust-debd45cc7be97c8a7c50c2822593471d04d87366.zip | |
Update to cranelift 0.91
Closes #1307
Diffstat (limited to 'src')
| -rw-r--r-- | src/base.rs | 5 | ||||
| -rw-r--r-- | src/common.rs | 9 | ||||
| -rw-r--r-- | src/intrinsics/llvm_x86.rs | 4 | ||||
| -rw-r--r-- | src/intrinsics/mod.rs | 2 | ||||
| -rw-r--r-- | src/value_and_place.rs | 4 |
5 files changed, 16 insertions, 8 deletions
diff --git a/src/base.rs b/src/base.rs index 89d955e8bf2..0df3ffc4bd8 100644 --- a/src/base.rs +++ b/src/base.rs @@ -113,6 +113,8 @@ pub(crate) fn codegen_fn<'tcx>( }; tcx.sess.time("codegen clif ir", || codegen_fn_body(&mut fx, start_block)); + fx.bcx.seal_all_blocks(); + fx.bcx.finalize(); // Recover all necessary data from fx, before accessing func will prevent future access to it. let symbol_name = fx.symbol_name; @@ -487,9 +489,6 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) { } }; } - - fx.bcx.seal_all_blocks(); - fx.bcx.finalize(); } fn codegen_stmt<'tcx>( diff --git a/src/common.rs b/src/common.rs index 2dcd42fbd8f..869977104e3 100644 --- a/src/common.rs +++ b/src/common.rs @@ -167,6 +167,15 @@ pub(crate) fn codegen_icmp_imm( } } +pub(crate) fn codegen_bitcast(fx: &mut FunctionCx<'_, '_, '_>, dst_ty: Type, val: Value) -> Value { + let mut flags = MemFlags::new(); + flags.set_endianness(match fx.tcx.data_layout.endian { + rustc_target::abi::Endian::Big => cranelift_codegen::ir::Endianness::Big, + rustc_target::abi::Endian::Little => cranelift_codegen::ir::Endianness::Little, + }); + fx.bcx.ins().bitcast(dst_ty, flags, val) +} + pub(crate) fn type_zero_value(bcx: &mut FunctionBuilder<'_>, ty: Type) -> Value { if ty == types::I128 { let zero = bcx.ins().iconst(types::I64, 0); diff --git a/src/intrinsics/llvm_x86.rs b/src/intrinsics/llvm_x86.rs index 7bc161fbe55..d2ae6978ca2 100644 --- a/src/intrinsics/llvm_x86.rs +++ b/src/intrinsics/llvm_x86.rs @@ -33,8 +33,8 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>( // cast float to int let a_lane = match lane_ty { - types::F32 => fx.bcx.ins().bitcast(types::I32, a_lane), - types::F64 => fx.bcx.ins().bitcast(types::I64, a_lane), + types::F32 => codegen_bitcast(fx, types::I32, a_lane), + types::F64 => codegen_bitcast(fx, types::I64, a_lane), _ => a_lane, }; diff --git a/src/intrinsics/mod.rs b/src/intrinsics/mod.rs index 548a6bf4584..3681154e788 100644 --- a/src/intrinsics/mod.rs +++ b/src/intrinsics/mod.rs @@ -200,7 +200,7 @@ fn bool_to_zero_or_max_uint<'tcx>( let mut res = fx.bcx.ins().bmask(int_ty, val); if ty.is_float() { - res = fx.bcx.ins().bitcast(ty, res); + res = codegen_bitcast(fx, ty, res); } res diff --git a/src/value_and_place.rs b/src/value_and_place.rs index fe8af21ac6d..fa06d6c3ba7 100644 --- a/src/value_and_place.rs +++ b/src/value_and_place.rs @@ -514,8 +514,8 @@ impl<'tcx> CPlace<'tcx> { (types::I32, types::F32) | (types::F32, types::I32) | (types::I64, types::F64) - | (types::F64, types::I64) => fx.bcx.ins().bitcast(dst_ty, data), - _ if src_ty.is_vector() && dst_ty.is_vector() => fx.bcx.ins().bitcast(dst_ty, data), + | (types::F64, types::I64) => codegen_bitcast(fx, dst_ty, data), + _ if src_ty.is_vector() && dst_ty.is_vector() => codegen_bitcast(fx, dst_ty, data), _ if src_ty.is_vector() || dst_ty.is_vector() => { // FIXME do something more efficient for transmutes between vectors and integers. let stack_slot = fx.bcx.create_sized_stack_slot(StackSlotData { |
