Auto merge of #151151 - Zalathar:rollup-kAQYrsB, r=Zalathar
Rollup of 2 pull requests Successful merges: - rust-lang/rust#151150 (Revert "avoid phi node for pointers flowing into Vec appends rust-lang/rust#130998") - rust-lang/rust#151145 (Reduce rustdoc GUI flakyness, take 2) r? @ghost
This commit is contained in:
commit
c9af9c1dc8
5 changed files with 29 additions and 56 deletions
|
|
@ -517,16 +517,7 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
|
|||
to_add.push(llvm::CreateAllocKindAttr(cx.llcx, AllocKindFlags::Free));
|
||||
// applies to argument place instead of function place
|
||||
let allocated_pointer = AttributeKind::AllocatedPointer.create_attr(cx.llcx);
|
||||
let attrs: &[_] = if llvm_util::get_version() >= (21, 0, 0) {
|
||||
// "Does not capture provenance" means "if the function call stashes the pointer somewhere,
|
||||
// accessing that pointer after the function returns is UB". That is definitely the case here since
|
||||
// freeing will destroy the provenance.
|
||||
let captures_addr = AttributeKind::CapturesAddress.create_attr(cx.llcx);
|
||||
&[allocated_pointer, captures_addr]
|
||||
} else {
|
||||
&[allocated_pointer]
|
||||
};
|
||||
attributes::apply_to_llfn(llfn, AttributePlace::Argument(0), attrs);
|
||||
attributes::apply_to_llfn(llfn, AttributePlace::Argument(0), &[allocated_pointer]);
|
||||
}
|
||||
if let Some(align) = codegen_fn_attrs.alignment {
|
||||
llvm::set_alignment(llfn, align);
|
||||
|
|
|
|||
|
|
@ -448,11 +448,9 @@ impl<T> [T] {
|
|||
// SAFETY:
|
||||
// allocated above with the capacity of `s`, and initialize to `s.len()` in
|
||||
// ptr::copy_to_non_overlapping below.
|
||||
if s.len() > 0 {
|
||||
unsafe {
|
||||
s.as_ptr().copy_to_nonoverlapping(v.as_mut_ptr(), s.len());
|
||||
v.set_len(s.len());
|
||||
}
|
||||
unsafe {
|
||||
s.as_ptr().copy_to_nonoverlapping(v.as_mut_ptr(), s.len());
|
||||
v.set_len(s.len());
|
||||
}
|
||||
v
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2818,11 +2818,7 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
let count = other.len();
|
||||
self.reserve(count);
|
||||
let len = self.len();
|
||||
if count > 0 {
|
||||
unsafe {
|
||||
ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count)
|
||||
};
|
||||
}
|
||||
unsafe { ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count) };
|
||||
self.len += count;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
//@ compile-flags: -O -Zmerge-functions=disabled
|
||||
//@ min-llvm-version: 21
|
||||
#![crate_type = "lib"]
|
||||
|
||||
//! Check that a temporary intermediate allocations can eliminated and replaced
|
||||
//! with memcpy forwarding.
|
||||
//! This requires Vec code to be structured in a way that avoids phi nodes from the
|
||||
//! zero-capacity length flowing into the memcpy arguments.
|
||||
|
||||
// CHECK-LABEL: @vec_append_with_temp_alloc
|
||||
#[no_mangle]
|
||||
pub fn vec_append_with_temp_alloc(dst: &mut Vec<u8>, src: &[u8]) {
|
||||
// CHECK-NOT: call void @llvm.memcpy
|
||||
// CHECK: call void @llvm.memcpy.{{.*}}%dst.i{{.*}}%src.0
|
||||
// CHECK-NOT: call void @llvm.memcpy
|
||||
let temp = src.to_vec();
|
||||
dst.extend(&temp);
|
||||
// CHECK: ret
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @string_append_with_temp_alloc
|
||||
#[no_mangle]
|
||||
pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) {
|
||||
// CHECK-NOT: call void @llvm.memcpy
|
||||
// CHECK: call void @llvm.memcpy.{{.*}}%dst.i{{.*}}%src.0
|
||||
// CHECK-NOT: call void @llvm.memcpy
|
||||
let temp = src.to_string();
|
||||
dst.push_str(&temp);
|
||||
// CHECK: ret
|
||||
}
|
||||
|
|
@ -29,9 +29,18 @@ define-function: (
|
|||
"open-settings-menu",
|
||||
[],
|
||||
block {
|
||||
call-function: ("click-settings-button", {})
|
||||
// Wait for the popover to appear...
|
||||
wait-for-css: ("#settings", {"display": "block"})
|
||||
store-count: ("#settings", nb_settings_menu)
|
||||
if: (|nb_settings_menu| != 0, block {
|
||||
store-css: ("#settings", {"display": settings_display})
|
||||
})
|
||||
else: block {
|
||||
store-value: (settings_display, "none")
|
||||
}
|
||||
if: (|settings_display| != "block", block {
|
||||
call-function: ("click-settings-button", {})
|
||||
// Wait for the popover to appear...
|
||||
wait-for-css: ("#settings", {"display": "block"})
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -39,9 +48,18 @@ define-function: (
|
|||
"close-settings-menu",
|
||||
[],
|
||||
block {
|
||||
call-function: ("click-settings-button", {})
|
||||
// Wait for the popover to disappear...
|
||||
wait-for-css-false: ("#settings", {"display": "block"})
|
||||
store-count: ("#settings", nb_settings_menu)
|
||||
if: (|nb_settings_menu| != 0, block {
|
||||
store-css: ("#settings", {"display": settings_display})
|
||||
})
|
||||
else: block {
|
||||
store-value: (settings_display, "block")
|
||||
}
|
||||
if: (|settings_display| == "block", block {
|
||||
call-function: ("click-settings-button", {})
|
||||
// Wait for the popover to disappear...
|
||||
wait-for-css-false: ("#settings", {"display": "block"})
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue