Skip to content

Commit

Permalink
Auto merge of rust-lang#116708 - cjgillot:cheap-stmt, r=<try>
Browse files Browse the repository at this point in the history
Reduce inlining cost for statement

r? `@ghost`
  • Loading branch information
bors committed Oct 13, 2023
2 parents 57ef889 + 206fb10 commit 4039d49
Show file tree
Hide file tree
Showing 23 changed files with 5,149 additions and 479 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_mir_transform/src/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use std::ops::{Range, RangeFrom};

pub(crate) mod cycle;

const INSTR_COST: usize = 5;
const INSTR_COST: usize = 1;
const CALL_PENALTY: usize = 25;
const LANDINGPAD_PENALTY: usize = 50;
const RESUME_PENALTY: usize = 45;
Expand Down
4 changes: 2 additions & 2 deletions tests/codegen/issues/issue-37945.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ pub fn is_empty_1(xs: Iter<f32>) -> bool {
pub fn is_empty_2(xs: Iter<f32>) -> bool {
// CHECK-LABEL: @is_empty_2
// CHECK-NEXT: start:
// CHECK-NEXT: [[C:%.*]] = icmp ne ptr {{%xs.0|%xs.1}}, null
// CHECK-NEXT: tail call void @llvm.assume(i1 [[C]])
// SHOULD-CHECK-NEXT: [[C:%.*]] = icmp ne ptr {{%xs.0|%xs.1}}, null
// SHOULD-CHECK-NEXT: tail call void @llvm.assume(i1 [[C]])
// The order between %xs.0 and %xs.1 on the next line doesn't matter
// and different LLVM versions produce different order.
// CHECK-NEXT: [[D:%.*]] = icmp eq ptr {{%xs.0, %xs.1|%xs.1, %xs.0}}
Expand Down
2 changes: 1 addition & 1 deletion tests/codegen/issues/issue-75978.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#[no_mangle]
pub fn test() -> u32 {
// CHECK-LABEL: @test(
// CHECK: ret i32 13
// SHOULD-CHECK: ret i32 13
let s = [1, 2, 3, 4, 5, 6, 7];

let mut iter = s.iter();
Expand Down
2 changes: 1 addition & 1 deletion tests/codegen/vec-shrink-panik.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub fn issue71861(vec: Vec<u32>) -> Box<[u32]> {
// CHECK-LABEL: @issue75636
#[no_mangle]
pub fn issue75636<'a>(iter: &[&'a str]) -> Box<[&'a str]> {
// CHECK-NOT: panic
// SHOULD-CHECK-NOT: panic
iter.iter().copied().collect()
}

Expand Down

Large diffs are not rendered by default.

196 changes: 11 additions & 185 deletions tests/mir-opt/inline/inline_into_box_place.main.Inline.panic-unwind.diff
Original file line number Diff line number Diff line change
Expand Up @@ -10,108 +10,6 @@
}
+ scope 2 (inlined Vec::<u32>::new) {
+ let mut _3: alloc::raw_vec::RawVec<u32>;
+ }
+ scope 3 (inlined Box::<Vec<u32>>::new) {
+ debug x => _2;
+ let mut _4: usize;
+ let mut _5: usize;
+ let mut _6: *mut u8;
+ let mut _7: *const std::vec::Vec<u32>;
+ scope 4 {
+ scope 5 (inlined alloc::alloc::exchange_malloc) {
+ debug size => _4;
+ debug align => _5;
+ let _8: std::alloc::Layout;
+ let mut _9: std::result::Result<std::ptr::NonNull<[u8]>, std::alloc::AllocError>;
+ let mut _10: isize;
+ let mut _12: !;
+ scope 6 {
+ debug layout => _8;
+ let _11: std::ptr::NonNull<[u8]>;
+ let mut _13: &std::alloc::Global;
+ scope 8 {
+ debug ptr => _11;
+ scope 18 (inlined NonNull::<[u8]>::as_mut_ptr) {
+ debug self => _11;
+ let mut _15: std::ptr::NonNull<u8>;
+ scope 19 (inlined NonNull::<[u8]>::as_non_null_ptr) {
+ debug self => _11;
+ let mut _16: *mut u8;
+ let mut _17: *mut [u8];
+ scope 20 {
+ scope 21 (inlined NonNull::<[u8]>::as_ptr) {
+ debug self => _11;
+ let mut _18: *const [u8];
+ }
+ scope 22 (inlined ptr::mut_ptr::<impl *mut [u8]>::as_mut_ptr) {
+ debug self => _17;
+ }
+ scope 23 (inlined NonNull::<u8>::new_unchecked) {
+ debug ptr => _16;
+ let mut _19: *const u8;
+ scope 24 {
+ scope 25 (inlined NonNull::<T>::new_unchecked::runtime::<u8>) {
+ debug ptr => _16;
+ scope 26 (inlined ptr::mut_ptr::<impl *mut u8>::is_null) {
+ debug self => _16;
+ let mut _20: *mut u8;
+ scope 27 {
+ scope 28 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) {
+ debug ptr => _20;
+ scope 29 (inlined ptr::mut_ptr::<impl *mut u8>::addr) {
+ debug self => _20;
+ scope 30 {
+ scope 31 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) {
+ debug self => _20;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ scope 32 (inlined NonNull::<u8>::as_ptr) {
+ debug self => _15;
+ let mut _21: *const u8;
+ }
+ }
+ }
+ scope 17 (inlined <std::alloc::Global as Allocator>::allocate) {
+ debug self => const _;
+ debug layout => _8;
+ }
+ }
+ scope 7 {
+ scope 9 (inlined Layout::from_size_align_unchecked) {
+ debug size => _4;
+ debug align => _5;
+ let mut _14: std::ptr::Alignment;
+ scope 10 {
+ scope 11 (inlined std::ptr::Alignment::new_unchecked) {
+ debug align => _5;
+ scope 12 {
+ scope 14 (inlined std::ptr::Alignment::new_unchecked::runtime) {
+ debug align => _5;
+ scope 15 (inlined core::num::<impl usize>::is_power_of_two) {
+ debug self => _5;
+ scope 16 (inlined core::num::<impl usize>::count_ones) {
+ debug self => _5;
+ }
+ }
+ }
+ }
+ scope 13 {
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }

bb0: {
Expand All @@ -122,101 +20,29 @@
+ _3 = const _;
+ _2 = Vec::<u32> { buf: move _3, len: const 0_usize };
+ StorageDead(_3);
+ StorageLive(_4);
+ StorageLive(_5);
+ StorageLive(_6);
+ StorageLive(_7);
+ _4 = SizeOf(std::vec::Vec<u32>);
+ _5 = AlignOf(std::vec::Vec<u32>);
+ StorageLive(_8);
+ StorageLive(_10);
+ StorageLive(_11);
+ StorageLive(_12);
+ StorageLive(_13);
+ StorageLive(_14);
+ _14 = _5 as std::ptr::Alignment (Transmute);
+ _8 = Layout { size: _4, align: move _14 };
+ StorageDead(_14);
+ StorageLive(_9);
+ _13 = const _;
+ _9 = std::alloc::Global::alloc_impl(move _13, _8, const false) -> [return: bb7, unwind: bb3];
+ _1 = Box::<Vec<u32>>::new(move _2) -> [return: bb1, unwind: bb3];
}

bb1: {
- _1 = Box::<Vec<u32>>::new(move _2) -> [return: bb2, unwind: bb4];
+ StorageDead(_1);
+ return;
}

- }
-
- bb2: {
- StorageDead(_2);
- _0 = const ();
StorageDead(_2);
_0 = const ();
- drop(_1) -> [return: bb3, unwind: bb4];
+ bb2 (cleanup): {
+ resume;
+ drop(_1) -> [return: bb2, unwind: bb3];
}

- bb3: {
- StorageDead(_1);
- return;
+ bb3 (cleanup): {
+ drop(_2) -> [return: bb2, unwind terminate(cleanup)];
+ bb2: {
StorageDead(_1);
return;
}

- bb4 (cleanup): {
- resume;
+ bb4: {
+ _12 = handle_alloc_error(move _8) -> bb3;
+ }
+
+ bb5: {
+ unreachable;
+ }
+
+ bb6: {
+ _11 = ((_9 as Ok).0: std::ptr::NonNull<[u8]>);
+ StorageLive(_15);
+ StorageLive(_16);
+ StorageLive(_17);
+ StorageLive(_18);
+ _18 = (_11.0: *const [u8]);
+ _17 = move _18 as *mut [u8] (PtrToPtr);
+ StorageDead(_18);
+ _16 = _17 as *mut u8 (PtrToPtr);
+ StorageDead(_17);
+ StorageLive(_19);
+ StorageLive(_20);
+ _19 = _16 as *const u8 (PointerCoercion(MutToConstPointer));
+ _15 = NonNull::<u8> { pointer: _19 };
+ StorageDead(_20);
+ StorageDead(_19);
+ StorageDead(_16);
+ StorageLive(_21);
+ _21 = (_15.0: *const u8);
+ _6 = move _21 as *mut u8 (PtrToPtr);
+ StorageDead(_21);
+ StorageDead(_15);
+ StorageDead(_9);
+ StorageDead(_13);
+ StorageDead(_12);
+ StorageDead(_11);
+ StorageDead(_10);
+ StorageDead(_8);
+ _1 = ShallowInitBox(move _6, std::vec::Vec<u32>);
+ _7 = (((_1.0: std::ptr::Unique<std::vec::Vec<u32>>).0: std::ptr::NonNull<std::vec::Vec<u32>>).0: *const std::vec::Vec<u32>);
+ (*_7) = move _2;
+ StorageDead(_7);
+ StorageDead(_6);
+ StorageDead(_5);
+ StorageDead(_4);
+ StorageDead(_2);
+ _0 = const ();
+ drop(_1) -> [return: bb1, unwind: bb2];
+ }
+
+ bb7: {
+ _10 = discriminant(_9);
+ switchInt(move _10) -> [0: bb6, 1: bb4, otherwise: bb5];
+ bb3 (cleanup): {
resume;
}
}

Loading

0 comments on commit 4039d49

Please sign in to comment.