| //@ test-mir-pass: GVN |
| //@ compile-flags: -O --crate-type=lib |
| //@ ignore-endian-big |
| // EMIT_MIR_FOR_EACH_BIT_WIDTH |
| |
| use std::mem::transmute; |
| |
| // EMIT_MIR transmute.less_as_i8.GVN.diff |
| pub fn less_as_i8() -> i8 { |
| // CHECK-LABEL: fn less_as_i8( |
| // CHECK: _0 = const -1_i8; |
| unsafe { transmute(std::cmp::Ordering::Less) } |
| } |
| |
| // EMIT_MIR transmute.from_char.GVN.diff |
| pub fn from_char() -> i32 { |
| // CHECK-LABEL: fn from_char( |
| // CHECK: _0 = const 82_i32; |
| unsafe { transmute('R') } |
| } |
| |
| // EMIT_MIR transmute.valid_char.GVN.diff |
| pub fn valid_char() -> char { |
| // CHECK-LABEL: fn valid_char( |
| // CHECK: _0 = const 'R'; |
| unsafe { transmute(0x52_u32) } |
| } |
| |
| // EMIT_MIR transmute.invalid_char.GVN.diff |
| pub unsafe fn invalid_char() -> char { |
| // CHECK-LABEL: fn invalid_char( |
| // CHECK: _0 = const {transmute(0x7fffffff): char}; |
| unsafe { transmute(i32::MAX) } |
| } |
| |
| // EMIT_MIR transmute.invalid_bool.GVN.diff |
| pub unsafe fn invalid_bool() -> bool { |
| // CHECK-LABEL: fn invalid_bool( |
| // CHECK: _0 = const {transmute(0xff): bool}; |
| unsafe { transmute(-1_i8) } |
| } |
| |
| // EMIT_MIR transmute.undef_union_as_integer.GVN.diff |
| pub unsafe fn undef_union_as_integer() -> u32 { |
| // CHECK-LABEL: fn undef_union_as_integer( |
| // CHECK: _1 = Union32 { |
| // CHECK: _0 = move _1 as u32 (Transmute); |
| union Union32 { |
| value: u32, |
| unit: (), |
| } |
| unsafe { transmute(Union32 { unit: () }) } |
| } |
| |
| // EMIT_MIR transmute.unreachable_direct.GVN.diff |
| pub unsafe fn unreachable_direct() -> ! { |
| // CHECK-LABEL: fn unreachable_direct( |
| // CHECK: = const (); |
| // CHECK: = const () as Never (Transmute); |
| let x: Never = unsafe { transmute(()) }; |
| match x {} |
| } |
| |
| // EMIT_MIR transmute.unreachable_ref.GVN.diff |
| pub unsafe fn unreachable_ref() -> ! { |
| // CHECK-LABEL: fn unreachable_ref( |
| // CHECK: = const {0x1 as &Never}; |
| let x: &Never = unsafe { transmute(1_usize) }; |
| match *x {} |
| } |
| |
| // EMIT_MIR transmute.unreachable_mut.GVN.diff |
| pub unsafe fn unreachable_mut() -> ! { |
| // CHECK-LABEL: fn unreachable_mut( |
| // CHECK: = const {0x1 as &mut Never}; |
| let x: &mut Never = unsafe { transmute(1_usize) }; |
| match *x {} |
| } |
| |
| // EMIT_MIR transmute.unreachable_box.GVN.diff |
| pub unsafe fn unreachable_box() -> ! { |
| // CHECK-LABEL: fn unreachable_box( |
| // CHECK: = const Box::<Never>( |
| let x: Box<Never> = unsafe { transmute(1_usize) }; |
| match *x {} |
| } |
| |
| enum Never {} |