1+ //@ add-core-stubs
12//@ compile-flags: -C opt-level=0 -C no-prepopulate-passes
23
34#![ crate_type = "lib" ]
5+ #![ feature( no_core, repr_simd, arm_target_feature, mips_target_feature, s390x_target_feature) ]
6+ #![ no_core]
7+ extern crate minicore;
8+
9+ use minicore:: * ;
410
511// With opaque ptrs in LLVM, `transmute` can load/store any `alloca` as any type,
612// without needing to pointercast, and SRoA will turn that into a `bitcast`.
1420// CHECK-NEXT: ret i32 %_0
1521#[ no_mangle]
1622pub fn f32_to_bits ( x : f32 ) -> u32 {
17- unsafe { std :: mem:: transmute ( x) }
23+ unsafe { mem:: transmute ( x) }
1824}
1925
2026// CHECK-LABEL: define{{.*}}i8 @bool_to_byte(i1 zeroext %b)
2127// CHECK: %_0 = zext i1 %b to i8
2228// CHECK-NEXT: ret i8 %_0
2329#[ no_mangle]
2430pub fn bool_to_byte ( b : bool ) -> u8 {
25- unsafe { std :: mem:: transmute ( b) }
31+ unsafe { mem:: transmute ( b) }
2632}
2733
2834// CHECK-LABEL: define{{.*}}zeroext i1 @byte_to_bool(i8{{.*}} %byte)
2935// CHECK: %_0 = trunc{{( nuw)?}} i8 %byte to i1
3036// CHECK-NEXT: ret i1 %_0
3137#[ no_mangle]
3238pub unsafe fn byte_to_bool ( byte : u8 ) -> bool {
33- std :: mem:: transmute ( byte)
39+ mem:: transmute ( byte)
3440}
3541
3642// CHECK-LABEL: define{{.*}}ptr @ptr_to_ptr(ptr %p)
3743// CHECK: ret ptr %p
3844#[ no_mangle]
3945pub fn ptr_to_ptr ( p : * mut u16 ) -> * mut u8 {
40- unsafe { std :: mem:: transmute ( p) }
46+ unsafe { mem:: transmute ( p) }
4147}
4248
4349// CHECK: define{{.*}}[[USIZE:i[0-9]+]] @ptr_to_int(ptr %p)
4450// CHECK: %_0 = ptrtoint ptr %p to [[USIZE]]
4551// CHECK-NEXT: ret [[USIZE]] %_0
4652#[ no_mangle]
4753pub fn ptr_to_int ( p : * mut u16 ) -> usize {
48- unsafe { std :: mem:: transmute ( p) }
54+ unsafe { mem:: transmute ( p) }
4955}
5056
5157// CHECK: define{{.*}}ptr @int_to_ptr([[USIZE]] %i)
5258// CHECK: %_0 = getelementptr i8, ptr null, [[USIZE]] %i
5359// CHECK-NEXT: ret ptr %_0
5460#[ no_mangle]
5561pub fn int_to_ptr ( i : usize ) -> * mut u16 {
56- unsafe { std :: mem:: transmute ( i) }
62+ unsafe { mem:: transmute ( i) }
5763}
5864
5965// This is the one case where signedness matters to transmuting:
@@ -70,15 +76,15 @@ pub enum FakeBoolSigned {
7076// CHECK-NEXT: ret i8 %_0
7177#[ no_mangle]
7278pub fn bool_to_fake_bool_signed ( b : bool ) -> FakeBoolSigned {
73- unsafe { std :: mem:: transmute ( b) }
79+ unsafe { mem:: transmute ( b) }
7480}
7581
7682// CHECK-LABEL: define{{.*}}i1 @fake_bool_signed_to_bool(i8 %b)
7783// CHECK: %_0 = trunc nuw i8 %b to i1
7884// CHECK-NEXT: ret i1 %_0
7985#[ no_mangle]
8086pub fn fake_bool_signed_to_bool ( b : FakeBoolSigned ) -> bool {
81- unsafe { std :: mem:: transmute ( b) }
87+ unsafe { mem:: transmute ( b) }
8288}
8389
8490#[ repr( u8 ) ]
@@ -91,12 +97,41 @@ pub enum FakeBoolUnsigned {
9197// CHECK: ret i1 %b
9298#[ no_mangle]
9399pub fn bool_to_fake_bool_unsigned ( b : bool ) -> FakeBoolUnsigned {
94- unsafe { std :: mem:: transmute ( b) }
100+ unsafe { mem:: transmute ( b) }
95101}
96102
97103// CHECK-LABEL: define{{.*}}i1 @fake_bool_unsigned_to_bool(i1 zeroext %b)
98104// CHECK: ret i1 %b
99105#[ no_mangle]
100106pub fn fake_bool_unsigned_to_bool ( b : FakeBoolUnsigned ) -> bool {
101- unsafe { std:: mem:: transmute ( b) }
107+ unsafe { mem:: transmute ( b) }
108+ }
109+
110+ #[ repr( simd) ]
111+ struct S ( [ i64 ; 1 ] ) ;
112+
113+ // CHECK-LABEL: define{{.*}}i64 @single_element_simd_to_scalar(<1 x i64> %b)
114+ // CHECK: bitcast <1 x i64> %b to i64
115+ // CHECK: ret i64
116+ #[ no_mangle]
117+ #[ cfg_attr( target_family = "wasm" , target_feature( enable = "simd128" ) ) ]
118+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "neon" ) ) ]
119+ #[ cfg_attr( target_arch = "x86" , target_feature( enable = "sse" ) ) ]
120+ #[ cfg_attr( target_arch = "mips" , target_feature( enable = "msa" ) ) ]
121+ #[ cfg_attr( target_arch = "s390x" , target_feature( enable = "vector" ) ) ]
122+ pub extern "C" fn single_element_simd_to_scalar ( b : S ) -> i64 {
123+ unsafe { mem:: transmute ( b) }
124+ }
125+
126+ // CHECK-LABEL: define{{.*}}<1 x i64> @scalar_to_single_element_simd(i64 %b)
127+ // CHECK: bitcast i64 %b to <1 x i64>
128+ // CHECK: ret <1 x i64>
129+ #[ no_mangle]
130+ #[ cfg_attr( target_family = "wasm" , target_feature( enable = "simd128" ) ) ]
131+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "neon" ) ) ]
132+ #[ cfg_attr( target_arch = "x86" , target_feature( enable = "sse" ) ) ]
133+ #[ cfg_attr( target_arch = "mips" , target_feature( enable = "msa" ) ) ]
134+ #[ cfg_attr( target_arch = "s390x" , target_feature( enable = "vector" ) ) ]
135+ pub extern "C" fn scalar_to_single_element_simd ( b : i64 ) -> S {
136+ unsafe { mem:: transmute ( b) }
102137}
0 commit comments