about summary refs log tree commit diff
path: root/src/test/codegen
diff options
context:
space:
mode:
authorEduard-Mihai Burtescu <eddyb@lyken.rs>2020-12-07 17:33:43 +0200
committerEduard-Mihai Burtescu <eddyb@lyken.rs>2020-12-07 18:19:43 +0200
commit97c7022d08fac94c09f671322c0696d65a75cca0 (patch)
tree30477c20542040936bb6ced6f7174171667cb0c3 /src/test/codegen
parente5721a5283b52afbf074d3bf13c3e37822278601 (diff)
downloadrust-97c7022d08fac94c09f671322c0696d65a75cca0.tar.gz
rust-97c7022d08fac94c09f671322c0696d65a75cca0.zip
rustc_codegen_ssa: use bitcasts instead of type punning for scalar transmutes.
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/transmute-scalar.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/codegen/transmute-scalar.rs b/src/test/codegen/transmute-scalar.rs
new file mode 100644
index 00000000000..48aea4a2f08
--- /dev/null
+++ b/src/test/codegen/transmute-scalar.rs
@@ -0,0 +1,35 @@
+// compile-flags: -C no-prepopulate-passes
+
+#![crate_type = "lib"]
+
+// CHECK: define i32 @f32_to_bits(float %x)
+// CHECK: %2 = bitcast float %x to i32
+// CHECK-NEXT: store i32 %2, i32* %0
+// CHECK-NEXT: %3 = load i32, i32* %0
+// CHECK: ret i32 %3
+#[no_mangle]
+pub fn f32_to_bits(x: f32) -> u32 {
+    unsafe { std::mem::transmute(x) }
+}
+
+// CHECK: define i8 @bool_to_byte(i1 zeroext %b)
+// CHECK: %1 = zext i1 %b to i8
+// CHECK-NEXT: store i8 %1, i8* %0
+// CHECK-NEXT: %2 = load i8, i8* %0
+// CHECK: ret i8 %2
+#[no_mangle]
+pub fn bool_to_byte(b: bool) -> u8 {
+    unsafe { std::mem::transmute(b) }
+}
+
+// CHECK: define zeroext i1 @byte_to_bool(i8 %byte)
+// CHECK: %1 = trunc i8 %byte to i1
+// CHECK-NEXT: %2 = zext i1 %1 to i8
+// CHECK-NEXT: store i8 %2, i8* %0
+// CHECK-NEXT: %3 = load i8, i8* %0
+// CHECK-NEXT: %4 = trunc i8 %3 to i1
+// CHECK: ret i1 %4
+#[no_mangle]
+pub unsafe fn byte_to_bool(byte: u8) -> bool {
+    std::mem::transmute(byte)
+}