diff options
| author | Eduard-Mihai Burtescu <eddyb@lyken.rs> | 2020-12-07 17:33:43 +0200 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <eddyb@lyken.rs> | 2020-12-07 18:19:43 +0200 |
| commit | 97c7022d08fac94c09f671322c0696d65a75cca0 (patch) | |
| tree | 30477c20542040936bb6ced6f7174171667cb0c3 /src/test/codegen | |
| parent | e5721a5283b52afbf074d3bf13c3e37822278601 (diff) | |
| download | rust-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.rs | 35 |
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) +} |
