forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#116110 - matthiaskrgr:rollup-qx1bt8s, r=matth…
…iaskrgr Rollup of 5 pull requests Successful merges: - rust-lang#115794 (Do not create a DerefLen place for `Box<[T]>`.) - rust-lang#116069 (Fix debug printing of tuple) - rust-lang#116075 (Document panics on unsigned wrapping_div/rem calls (rust-lang#116063)) - rust-lang#116076 (Add Zba, Zbb, and Zbs as target features for riscv64-linux-android) - rust-lang#116078 (Add assembly test to make sure that inlining works as expected when closures inherit target features) r? `@ghost` `@rustbot` modify labels: rollup
- Loading branch information
Showing
14 changed files
with
1,041 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
// only-x86_64 | ||
// assembly-output: emit-asm | ||
// make sure the feature is not enabled at compile-time | ||
// compile-flags: -C target-feature=-sse4.1 -C llvm-args=-x86-asm-syntax=intel | ||
|
||
#![feature(target_feature_11)] | ||
#![crate_type = "rlib"] | ||
|
||
use std::arch::x86_64::{__m128, _mm_blend_ps}; | ||
|
||
#[no_mangle] | ||
pub unsafe fn sse41_blend_nofeature(x: __m128, y: __m128) -> __m128 { | ||
let f = { | ||
// check that _mm_blend_ps is not being inlined into the closure | ||
// CHECK-LABEL: {{sse41_blend_nofeature.*closure.*:}} | ||
// CHECK-NOT: blendps | ||
// CHECK: {{call .*_mm_blend_ps.*}} | ||
// CHECK-NOT: blendps | ||
// CHECK: ret | ||
#[inline(never)] |x, y| _mm_blend_ps(x, y, 0b0101) | ||
}; | ||
f(x, y) | ||
} | ||
|
||
#[target_feature(enable = "sse4.1")] | ||
pub fn sse41_blend_noinline(x: __m128, y: __m128) -> __m128 { | ||
let f = { | ||
// check that _mm_blend_ps is being inlined into the closure | ||
// CHECK-LABEL: {{sse41_blend_noinline.*closure.*:}} | ||
// CHECK-NOT: _mm_blend_ps | ||
// CHECK: blendps | ||
// CHECK-NOT: _mm_blend_ps | ||
// CHECK: ret | ||
#[inline(never)] |x, y| unsafe { | ||
_mm_blend_ps(x, y, 0b0101) | ||
} | ||
}; | ||
f(x, y) | ||
} | ||
|
||
#[no_mangle] | ||
#[target_feature(enable = "sse4.1")] | ||
pub fn sse41_blend_doinline(x: __m128, y: __m128) -> __m128 { | ||
// check that the closure and _mm_blend_ps are being inlined into the function | ||
// CHECK-LABEL: sse41_blend_doinline: | ||
// CHECK-NOT: {{sse41_blend_doinline.*closure.*}} | ||
// CHECK-NOT: _mm_blend_ps | ||
// CHECK: blendps | ||
// CHECK-NOT: {{sse41_blend_doinline.*closure.*}} | ||
// CHECK-NOT: _mm_blend_ps | ||
// CHECK: ret | ||
let f = { | ||
#[inline] |x, y| unsafe { | ||
_mm_blend_ps(x, y, 0b0101) | ||
} | ||
}; | ||
f(x, y) | ||
} |
119 changes: 119 additions & 0 deletions
119
tests/mir-opt/dataflow-const-prop/default_boxed_slice.main.ConstProp.32bit.panic-abort.diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
- // MIR for `main` before ConstProp | ||
+ // MIR for `main` after ConstProp | ||
|
||
fn main() -> () { | ||
let mut _0: (); | ||
let _1: A; | ||
let mut _2: std::boxed::Box<[bool]>; | ||
scope 1 { | ||
debug a => _1; | ||
} | ||
scope 2 (inlined <Box<[bool]> as Default>::default) { | ||
let _3: std::ptr::Unique<[bool]>; | ||
let mut _4: std::ptr::Unique<[bool; 0]>; | ||
scope 3 { | ||
debug ptr => _3; | ||
} | ||
scope 4 (inlined Unique::<[bool; 0]>::dangling) { | ||
let mut _5: std::ptr::NonNull<[bool; 0]>; | ||
scope 5 (inlined NonNull::<[bool; 0]>::dangling) { | ||
let mut _7: usize; | ||
scope 6 { | ||
let _6: *mut [bool; 0]; | ||
scope 7 { | ||
debug ptr => _6; | ||
scope 11 (inlined NonNull::<[bool; 0]>::new_unchecked) { | ||
debug ptr => _6; | ||
let mut _8: *const [bool; 0]; | ||
scope 12 { | ||
scope 13 (inlined NonNull::<T>::new_unchecked::runtime::<[bool; 0]>) { | ||
debug ptr => _6; | ||
scope 14 (inlined ptr::mut_ptr::<impl *mut [bool; 0]>::is_null) { | ||
debug self => _6; | ||
let mut _9: *mut u8; | ||
scope 15 { | ||
scope 16 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) { | ||
debug ptr => _9; | ||
scope 17 (inlined ptr::mut_ptr::<impl *mut u8>::addr) { | ||
debug self => _9; | ||
scope 18 { | ||
scope 19 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) { | ||
debug self => _9; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
scope 8 (inlined align_of::<[bool; 0]>) { | ||
} | ||
scope 9 (inlined invalid_mut::<[bool; 0]>) { | ||
debug addr => _7; | ||
scope 10 { | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
bb0: { | ||
StorageLive(_1); | ||
StorageLive(_2); | ||
StorageLive(_3); | ||
StorageLive(_4); | ||
StorageLive(_5); | ||
StorageLive(_6); | ||
StorageLive(_7); | ||
- _7 = AlignOf([bool; 0]); | ||
- _6 = _7 as *mut [bool; 0] (Transmute); | ||
+ _7 = const 1_usize; | ||
+ _6 = const {0x1 as *mut [bool; 0]}; | ||
StorageDead(_7); | ||
StorageLive(_8); | ||
StorageLive(_9); | ||
- _8 = _6 as *const [bool; 0] (PointerCoercion(MutToConstPointer)); | ||
- _5 = NonNull::<[bool; 0]> { pointer: _8 }; | ||
+ _8 = const {0x1 as *const [bool; 0]}; | ||
+ _5 = const NonNull::<[bool; 0]> {{ pointer: {0x1 as *const [bool; 0]} }}; | ||
StorageDead(_9); | ||
StorageDead(_8); | ||
StorageDead(_6); | ||
- _4 = Unique::<[bool; 0]> { pointer: move _5, _marker: const PhantomData::<[bool; 0]> }; | ||
+ _4 = const Unique::<[bool; 0]> {{ pointer: NonNull::<[bool; 0]> {{ pointer: {0x1 as *const [bool; 0]} }}, _marker: PhantomData::<[bool; 0]> }}; | ||
StorageDead(_5); | ||
- _3 = move _4 as std::ptr::Unique<[bool]> (PointerCoercion(Unsize)); | ||
+ _3 = const Unique::<[bool]> {{ pointer: NonNull::<[bool]> {{ pointer: Indirect { alloc_id: alloc7, offset: Size(0 bytes) }: *const [bool] }}, _marker: PhantomData::<[bool]> }}; | ||
StorageDead(_4); | ||
- _2 = Box::<[bool]>(_3, const std::alloc::Global); | ||
+ _2 = const Box::<[bool]>(Unique::<[bool]> {{ pointer: NonNull::<[bool]> {{ pointer: Indirect { alloc_id: alloc10, offset: Size(0 bytes) }: *const [bool] }}, _marker: PhantomData::<[bool]> }}, std::alloc::Global); | ||
StorageDead(_3); | ||
- _1 = A { foo: move _2 }; | ||
+ _1 = A { foo: const Box::<[bool]>(Unique::<[bool]> {{ pointer: NonNull::<[bool]> {{ pointer: Indirect { alloc_id: alloc11, offset: Size(0 bytes) }: *const [bool] }}, _marker: PhantomData::<[bool]> }}, std::alloc::Global) }; | ||
StorageDead(_2); | ||
_0 = const (); | ||
drop(_1) -> [return: bb1, unwind unreachable]; | ||
} | ||
|
||
bb1: { | ||
StorageDead(_1); | ||
return; | ||
} | ||
+ } | ||
+ | ||
+ alloc11 (size: 8, align: 4) { | ||
+ 01 00 00 00 00 00 00 00 │ ........ | ||
+ } | ||
+ | ||
+ alloc10 (size: 8, align: 4) { | ||
+ 01 00 00 00 00 00 00 00 │ ........ | ||
+ } | ||
+ | ||
+ alloc7 (size: 8, align: 4) { | ||
+ 01 00 00 00 00 00 00 00 │ ........ | ||
} | ||
|
123 changes: 123 additions & 0 deletions
123
tests/mir-opt/dataflow-const-prop/default_boxed_slice.main.ConstProp.32bit.panic-unwind.diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
- // MIR for `main` before ConstProp | ||
+ // MIR for `main` after ConstProp | ||
|
||
fn main() -> () { | ||
let mut _0: (); | ||
let _1: A; | ||
let mut _2: std::boxed::Box<[bool]>; | ||
scope 1 { | ||
debug a => _1; | ||
} | ||
scope 2 (inlined <Box<[bool]> as Default>::default) { | ||
let _3: std::ptr::Unique<[bool]>; | ||
let mut _4: std::ptr::Unique<[bool; 0]>; | ||
scope 3 { | ||
debug ptr => _3; | ||
} | ||
scope 4 (inlined Unique::<[bool; 0]>::dangling) { | ||
let mut _5: std::ptr::NonNull<[bool; 0]>; | ||
scope 5 (inlined NonNull::<[bool; 0]>::dangling) { | ||
let mut _7: usize; | ||
scope 6 { | ||
let _6: *mut [bool; 0]; | ||
scope 7 { | ||
debug ptr => _6; | ||
scope 11 (inlined NonNull::<[bool; 0]>::new_unchecked) { | ||
debug ptr => _6; | ||
let mut _8: *const [bool; 0]; | ||
scope 12 { | ||
scope 13 (inlined NonNull::<T>::new_unchecked::runtime::<[bool; 0]>) { | ||
debug ptr => _6; | ||
scope 14 (inlined ptr::mut_ptr::<impl *mut [bool; 0]>::is_null) { | ||
debug self => _6; | ||
let mut _9: *mut u8; | ||
scope 15 { | ||
scope 16 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) { | ||
debug ptr => _9; | ||
scope 17 (inlined ptr::mut_ptr::<impl *mut u8>::addr) { | ||
debug self => _9; | ||
scope 18 { | ||
scope 19 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) { | ||
debug self => _9; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
scope 8 (inlined align_of::<[bool; 0]>) { | ||
} | ||
scope 9 (inlined invalid_mut::<[bool; 0]>) { | ||
debug addr => _7; | ||
scope 10 { | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
bb0: { | ||
StorageLive(_1); | ||
StorageLive(_2); | ||
StorageLive(_3); | ||
StorageLive(_4); | ||
StorageLive(_5); | ||
StorageLive(_6); | ||
StorageLive(_7); | ||
- _7 = AlignOf([bool; 0]); | ||
- _6 = _7 as *mut [bool; 0] (Transmute); | ||
+ _7 = const 1_usize; | ||
+ _6 = const {0x1 as *mut [bool; 0]}; | ||
StorageDead(_7); | ||
StorageLive(_8); | ||
StorageLive(_9); | ||
- _8 = _6 as *const [bool; 0] (PointerCoercion(MutToConstPointer)); | ||
- _5 = NonNull::<[bool; 0]> { pointer: _8 }; | ||
+ _8 = const {0x1 as *const [bool; 0]}; | ||
+ _5 = const NonNull::<[bool; 0]> {{ pointer: {0x1 as *const [bool; 0]} }}; | ||
StorageDead(_9); | ||
StorageDead(_8); | ||
StorageDead(_6); | ||
- _4 = Unique::<[bool; 0]> { pointer: move _5, _marker: const PhantomData::<[bool; 0]> }; | ||
+ _4 = const Unique::<[bool; 0]> {{ pointer: NonNull::<[bool; 0]> {{ pointer: {0x1 as *const [bool; 0]} }}, _marker: PhantomData::<[bool; 0]> }}; | ||
StorageDead(_5); | ||
- _3 = move _4 as std::ptr::Unique<[bool]> (PointerCoercion(Unsize)); | ||
+ _3 = const Unique::<[bool]> {{ pointer: NonNull::<[bool]> {{ pointer: Indirect { alloc_id: alloc7, offset: Size(0 bytes) }: *const [bool] }}, _marker: PhantomData::<[bool]> }}; | ||
StorageDead(_4); | ||
- _2 = Box::<[bool]>(_3, const std::alloc::Global); | ||
+ _2 = const Box::<[bool]>(Unique::<[bool]> {{ pointer: NonNull::<[bool]> {{ pointer: Indirect { alloc_id: alloc10, offset: Size(0 bytes) }: *const [bool] }}, _marker: PhantomData::<[bool]> }}, std::alloc::Global); | ||
StorageDead(_3); | ||
- _1 = A { foo: move _2 }; | ||
+ _1 = A { foo: const Box::<[bool]>(Unique::<[bool]> {{ pointer: NonNull::<[bool]> {{ pointer: Indirect { alloc_id: alloc11, offset: Size(0 bytes) }: *const [bool] }}, _marker: PhantomData::<[bool]> }}, std::alloc::Global) }; | ||
StorageDead(_2); | ||
_0 = const (); | ||
drop(_1) -> [return: bb1, unwind: bb2]; | ||
} | ||
|
||
bb1: { | ||
StorageDead(_1); | ||
return; | ||
} | ||
|
||
bb2 (cleanup): { | ||
resume; | ||
} | ||
+ } | ||
+ | ||
+ alloc11 (size: 8, align: 4) { | ||
+ 01 00 00 00 00 00 00 00 │ ........ | ||
+ } | ||
+ | ||
+ alloc10 (size: 8, align: 4) { | ||
+ 01 00 00 00 00 00 00 00 │ ........ | ||
+ } | ||
+ | ||
+ alloc7 (size: 8, align: 4) { | ||
+ 01 00 00 00 00 00 00 00 │ ........ | ||
} | ||
|
Oops, something went wrong.