message: Don't use data object for non-primitive scalars
  Fixes
diff: //! Handling of `static`s, `const`s and promoted allocations
  -use rustc_span::DUMMY_SP;
  -
  -use rustc_ast::Mutability;
  use rustc_data_structures::fx::{FxHashMap, FxHashSet};
  use rustc_errors::ErrorReported;
  use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
  use rustc_middle::mir::interpret::{
  - alloc_range, read_target_uint, AllocId, Allocation, ConstValue, ErrorHandled, GlobalAlloc,
  - Scalar,
  + read_target_uint, AllocId, Allocation, ConstValue, ErrorHandled, GlobalAlloc, Scalar,
  };
  use rustc_middle::ty::ConstKind;
  +use rustc_span::DUMMY_SP;
  use cranelift_codegen::ir::GlobalValueData;
  use cranelift_module::*;
  @@ -171,21 +168,31 @@ pub(crate) fn codegen_const_value<'tcx>(
  }
  match const_val {
  - ConstValue::Scalar(x) => {
  - if fx.clif_type(layout.ty).is_none() {
  - let (size, align) = (layout.size, layout.align.pref);
  - let mut alloc = Allocation::from_bytes(
  - std::iter::repeat(0).take(size.bytes_usize()).collect::<Vec<u8>>(),
  - align,
  - Mutability::Not,
  - );
  - alloc.write_scalar(fx, alloc_range(Size::ZERO, size), x.into()).unwrap();
  - let alloc = fx.tcx.intern_const_alloc(alloc);
  - return CValue::by_ref(pointer_for_allocation(fx, alloc), layout);
  - }
  + ConstValue::Scalar(x) => match x {
  + Scalar::Int(int) => {
  + if fx.clif_type(layout.ty).is_some() {
  + return CValue::const_val(fx, layout, int);
  + } else {
  + let raw_val = int.to_bits(int.size()).unwrap();
  + let val = match int.size().bytes() {
  + 1 => fx.bcx.ins().iconst(types::I8, raw_val as i64),
  + 2 => fx.bcx.ins().iconst(types::I16, raw_val as i64),
  + 4 => fx.bcx.ins().iconst(types::I32, raw_val as i64),
  + 8 => fx.bcx.ins().iconst(types::I64, raw_val as i64),
  + 16 => {
  + let lsb = fx.bcx.ins().iconst(types::I64, raw_val as u64 as i64);
  + let msb =
  + fx.bcx.ins().iconst(types::I64, (raw_val >> 64) as u64 as i64);
  + fx.bcx.ins().iconcat(lsb, msb)
  + }
  + _ => unreachable!(),
  + };
  - match x {
  - Scalar::Int(int) => CValue::const_val(fx, layout, int),
  + let place = CPlace::new_stack_slot(fx, layout);
  + place.to_ptr().store(fx, val, MemFlags::trusted());
  + place.to_cvalue(fx)
  + }
  + }
  Scalar::Ptr(ptr) => {
  let alloc_kind = fx.tcx.get_global_alloc(ptr.alloc_id);
  let base_addr = match alloc_kind {
  @@ -228,8 +235,7 @@ pub(crate) fn codegen_const_value<'tcx>(
  };
  CValue::by_val(val, layout)
  }
  - }
  - }
  + },
  ConstValue::ByRef { alloc, offset } => CValue::by_ref(
  pointer_for_allocation(fx, alloc)
  .offset_i64(fx, i64::try_from(offset.bytes()).unwrap()),
  