Skip to content

Conversation

scottmcm
Copy link
Member

@scottmcm scottmcm commented Nov 15, 2024

This works by always putting the counts just before the value, rather than using an RcInner type at all.

By doing that, the offset to the counts are exactly the same for all types -- small or large, low alignment or high -- so Rc::clone can be polymorphized, and Rc::deref is always just a no-op.

r? ghost

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Nov 15, 2024
@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@Victoronz
Copy link

How does this relate to #132553?

@scottmcm
Copy link
Member Author

scottmcm commented Nov 15, 2024

@Victoronz Oh, I didn't even know that existed.

Well, taking a look, the difference is that it looks like the codegen test I added here wouldn't pass with that version of the PR, because that still keeps the different offsets from the counts to the value.

So that one makes Deref a no-op, like this one does, but doesn't make clone identical for all types.

EDIT: updated the title and OP to help make that clearer.

@rust-log-analyzer

This comment has been minimized.

@scottmcm scottmcm force-pushed the dedup-rc branch 2 times, most recently from 60ccc17 to 103ecd6 Compare November 15, 2024 06:50
@scottmcm scottmcm changed the title [DRAFT] Rc: store the pointer to the value, rather than to the allocation [DRAFT] Rc: allow deduping both deref and clone across types Nov 15, 2024
@rust-log-analyzer
Copy link
Collaborator

The job x86_64-gnu-llvm-18 failed! Check out the build log: (web) (plain)

Click to see the possible cause of the failure (guessed by this bot)
------
 > importing cache manifest from ghcr.io/rust-lang/rust-ci-cache:c32c805632780b5c1de330e3f44561b336c2efe163bc0990acb392390157a8e1d9f855d75914a239aa40c49d77f4a837247d05d2f8d46f554b98e1f46712a3e3:
------
##[endgroup]
Setting extra environment values for docker:  --env ENABLE_GCC_CODEGEN=1 --env GCC_EXEC_PREFIX=/usr/lib/gcc/
[CI_JOB_NAME=x86_64-gnu-llvm-18]
debug: `DISABLE_CI_RUSTC_IF_INCOMPATIBLE` configured.
---
sccache: Starting the server...
##[group]Configure the build
configure: processing command line
configure: 
configure: build.configure-args := ['--build=x86_64-unknown-linux-gnu', '--llvm-root=/usr/lib/llvm-18', '--enable-llvm-link-shared', '--set', 'rust.randomize-layout=true', '--set', 'rust.thin-lto-import-instr-limit=10', '--enable-verbose-configure', '--enable-sccache', '--disable-manage-submodules', '--enable-locked-deps', '--enable-cargo-native-static', '--set', 'rust.codegen-units-std=1', '--set', 'dist.compression-profile=balanced', '--dist-compression-formats=xz', '--set', 'rust.lld=false', '--disable-dist-src', '--release-channel=nightly', '--enable-debug-assertions', '--enable-overflow-checks', '--enable-llvm-assertions', '--set', 'rust.verify-llvm-ir', '--set', 'rust.codegen-backends=llvm,cranelift,gcc', '--set', 'llvm.static-libstdcpp', '--enable-new-symbol-mangling']
configure: target.x86_64-unknown-linux-gnu.llvm-config := /usr/lib/llvm-18/bin/llvm-config
configure: llvm.link-shared     := True
configure: rust.randomize-layout := True
configure: rust.thin-lto-import-instr-limit := 10
---
failures:

---- [codegen] tests/codegen/rc-dedup.rs stdout ----

error: verification with 'FileCheck' failed
status: exit status: 1
command: "/usr/lib/llvm-18/bin/FileCheck" "--input-file" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/rc-dedup/rc-dedup.ll" "/checkout/tests/codegen/rc-dedup.rs" "--check-prefix=CHECK" "--check-prefix" "NONMSVC" "--allow-unused-prefixes" "--dump-input-context" "100"
--- stderr -------------------------------
/checkout/tests/codegen/rc-dedup.rs:47:12: error: CHECK: expected string not found in input
/checkout/tests/codegen/rc-dedup.rs:47:12: error: CHECK: expected string not found in input
 // CHECK: %[[STRONG_P:.+]] = getelementptr inbounds i8, ptr %[[VAL_P]], {{i64 -8|i32 -4|i16 -2}}
           ^
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/rc-dedup/rc-dedup.ll:21:24: note: scanning from here
 %_2 = load ptr, ptr %p, align 8, !nonnull !3, !noundef !3
                       ^
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/rc-dedup/rc-dedup.ll:21:24: note: with "VAL_P" equal to "_2"
 %_2 = load ptr, ptr %p, align 8, !nonnull !3, !noundef !3
                       ^
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/rc-dedup/rc-dedup.ll:22:7: note: possible intended match here
 %_12.i.i = getelementptr %"alloc::rc::RcCounts", ptr %_2, i64 -1, i32 1


Input file: /checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/rc-dedup/rc-dedup.ll
Check file: /checkout/tests/codegen/rc-dedup.rs

-dump-input=help explains the following input dump.
Input was:
<<<<<<
<<<<<<
            1: ; ModuleID = 'rc_dedup.379b9d65079ff7f9-cgu.0' 
            2: source_filename = "rc_dedup.379b9d65079ff7f9-cgu.0" 
            3: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" 
            4: target triple = "x86_64-unknown-linux-gnu" 
            5:  
            6: %"alloc::rc::RcCounts" = type { i64, i64 } 
            7:  
            8: @small_deref = unnamed_addr alias ptr (ptr), ptr @big_deref 
            9: @small_clone = unnamed_addr alias ptr (ptr), ptr @big_clone 
           10:  
           11: ; Function Attrs: mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(argmem: read) uwtable 
           12: define noundef nonnull ptr @big_deref(ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %p) unnamed_addr #0 { 
           13: start: 
           14:  %_2 = load ptr, ptr %p, align 8, !nonnull !3, !noundef !3 
           15:  ret ptr %_2 
           16: } 
           17:  
           18: ; Function Attrs: nounwind nonlazybind memory(readwrite, inaccessiblemem: write) uwtable 
           19: define noundef nonnull ptr @big_clone(ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %p) unnamed_addr #1 { 
           20: start: 
           21:  %_2 = load ptr, ptr %p, align 8, !nonnull !3, !noundef !3 
check:47'0                            X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
check:47'1                                                                 with "VAL_P" equal to "_2"
           22:  %_12.i.i = getelementptr %"alloc::rc::RcCounts", ptr %_2, i64 -1, i32 1 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:47'2           ?                                                                   possible intended match
           23:  %strong.i.i = load i64, ptr %_12.i.i, align 8, !noundef !3 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           24:  %cond.i.i = icmp ne i64 %strong.i.i, 0 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           25:  tail call void @llvm.assume(i1 %cond.i.i) 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           26:  %strong3.i.i = add i64 %strong.i.i, 1 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           27:  store i64 %strong3.i.i, ptr %_12.i.i, align 8, !alias.scope !4 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           28:  %_7.i.i = icmp eq i64 %strong3.i.i, 0 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           29:  br i1 %_7.i.i, label %bb2.i.i, label %_RNvNvXss_NtCs3WZ5KMa5SEj_5alloc2rcINtB7_2RcppENtNtCs9wfsaRGo7vI_4core5clone5Clone5clone17clone_polymorphic.exit 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:47'0     ~
check:47'0     ~
           31: bb2.i.i: ; preds = %start 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~
           32:  tail call void @llvm.trap() 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           33:  unreachable 
check:47'0     ~~~~~~~~~~~~~
check:47'0     ~
check:47'0     ~
           35: _RNvNvXss_NtCs3WZ5KMa5SEj_5alloc2rcINtB7_2RcppENtNtCs9wfsaRGo7vI_4core5clone5Clone5clone17clone_polymorphic.exit: ; preds = %start 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           36:  ret ptr %_2 
check:47'0     ~~~~~~~~~~~~~
           37: } 
check:47'0     ~~
check:47'0     ~
check:47'0     ~
           39: ; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           40: declare void @llvm.assume(i1 noundef) #2 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:47'0     ~
check:47'0     ~
           42: ; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write) 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           43: declare void @llvm.trap() #3 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:47'0     ~
check:47'0     ~
           45: attributes #0 = { mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(argmem: read) uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           46: attributes #1 = { nounwind nonlazybind memory(readwrite, inaccessiblemem: write) uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           47: attributes #2 = { mustprogress nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) } 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           48: attributes #3 = { cold noreturn nounwind memory(inaccessiblemem: write) } 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:47'0     ~
check:47'0     ~
           50: !llvm.module.flags = !{!0, !1} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           51: !llvm.ident = !{!2} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~
check:47'0     ~
check:47'0     ~
           53: !0 = !{i32 8, !"PIC Level", i32 2} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           54: !1 = !{i32 2, !"RtLibUseGOT", i32 1} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           55: !2 = !{!"rustc version 1.84.0-nightly (bc2ff49d5 2024-11-15)"} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           56: !3 = !{} 
check:47'0     ~~~~~~~~~
           57: !4 = !{!5} 
check:47'0     ~~~~~~~~~~~
           58: !5 = distinct !{!5, !6, !"_ZN4core3mem7replace17h9dfbf894b9467db0E: %dest"} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           59: !6 = distinct !{!6, !"_ZN4core3mem7replace17h9dfbf894b9467db0E"} 
check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------


---- [codegen] tests/codegen/virtual-function-elimination.rs stdout ----
---- [codegen] tests/codegen/virtual-function-elimination.rs stdout ----

error: verification with 'FileCheck' failed
status: exit status: 1
command: "/usr/lib/llvm-18/bin/FileCheck" "--input-file" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll" "/checkout/tests/codegen/virtual-function-elimination.rs" "--check-prefix=CHECK" "--check-prefix" "NONMSVC" "--allow-unused-prefixes" "--dump-input-context" "100"
--- stderr -------------------------------
/checkout/tests/codegen/virtual-function-elimination.rs:4:11: error: CHECK: expected string not found in input
/checkout/tests/codegen/virtual-function-elimination.rs:4:11: error: CHECK: expected string not found in input
// CHECK: @vtable.0 = {{.*}}, !type ![[TYPE0:[0-9]+]], !vcall_visibility ![[VCALL_VIS0:[0-9]+]]
          ^
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll:1:1: note: scanning from here
; ModuleID = 'virtual_function_elimination.46c5f1f8bd07bc6b-cgu.0'
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll:9:439: note: possible intended match here
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll:9:439: note: possible intended match here
@vtable.1 = private unnamed_addr constant <{ [24 x i8], ptr, ptr, ptr, ptr, ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00", ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T4usedB4_, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T22used_through_sub_traitB4_, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T5by_rcB4_, ptr null, ptr null }>, align 8, !type !0, !vcall_visibility !1
/checkout/tests/codegen/virtual-function-elimination.rs:96:14: error: undefined variable: TYPE0
/checkout/tests/codegen/virtual-function-elimination.rs:96:14: error: undefined variable: TYPE0
// CHECK: ![[TYPE0]] = !{i64 0, !"[[MANGLED_TYPE0]]"}
             ^
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll:141:141: note: with "MANGLED_TYPE0" equal to "NtCs64ITQYi9761_28virtual_function_elimination1T"
 %12 = call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.3, i32 24, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1V")
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll:178:1: note: possible intended match here
/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll:178:1: note: possible intended match here
!0 = !{i64 0, !"NtCs64ITQYi9761_28virtual_function_elimination1T"}

Input file: /checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/virtual-function-elimination/virtual-function-elimination.ll
Check file: /checkout/tests/codegen/virtual-function-elimination.rs


-dump-input=help explains the following input dump.
Input was:
<<<<<<
<<<<<<
            1: ; ModuleID = 'virtual_function_elimination.46c5f1f8bd07bc6b-cgu.0' 
check:4'0      X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
            2: source_filename = "virtual_function_elimination.46c5f1f8bd07bc6b-cgu.0" 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            3: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            4: target triple = "x86_64-unknown-linux-gnu" 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~
check:4'0      ~
            6: %"alloc::rc::RcCounts" = type { i64, i64 } 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~
check:4'0      ~
            8: @__rust_no_alloc_shim_is_unstable = external global i8 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            9: @vtable.1 = private unnamed_addr constant <{ [24 x i8], ptr, ptr, ptr, ptr, ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00", ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T4usedB4_, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T22used_through_sub_traitB4_, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T5by_rcB4_, ptr null, ptr null }>, align 8, !type !0, !vcall_visibility !1 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'1                                                                                                                                                                                                                                                                                                                                                                                                                                                            ?                                           possible intended match
           10: @vtable.2 = private unnamed_addr constant <{ [24 x i8], ptr, ptr, ptr, ptr, ptr, ptr, ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00", ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T4usedB4_, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T22used_through_sub_traitB4_, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T5by_rcB4_, ptr null, ptr null, ptr @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1U13subtrait_usedB4_, ptr null }>, align 8, !type !2, !vcall_visibility !1 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           11: @vtable.3 = private unnamed_addr constant <{ [24 x i8], ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00", ptr @_RNvXs0_Cs64ITQYi9761_28virtual_function_eliminationNtB5_1SNtB5_1V15public_function }>, align 8, !type !3, !vcall_visibility !4 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~
check:4'0      ~
           13: ; alloc::rc::polymorphic::allocate_for_layout::<<alloc::rc::UniqueRcUninit<virtual_function_elimination::S>>::allocate_unsized_in<<alloc::alloc::Global as core::alloc::Allocator>::allocate>::{closure#0}>::{closure#0} 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           14: ; Function Attrs: inlinehint noreturn nonlazybind uwtable 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           15: define internal fastcc void @_RNCINvNtNtCs3WZ5KMa5SEj_5alloc2rc11polymorphic19allocate_for_layoutNCINvMs1k_B6_INtB6_14UniqueRcUninitNtCs64ITQYi9761_28virtual_function_elimination1SE19allocate_unsized_inNvYNtNtB8_5alloc6GlobalNtNtCs9wfsaRGo7vI_4core5alloc9Allocator8allocateE0E0B1E_(i64 noundef %layout.0, i64 noundef %layout.1) unnamed_addr #0 { 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~~~~~~~
           17: ; call alloc::alloc::handle_alloc_error 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           18:  tail call void @_RNvNtCs3WZ5KMa5SEj_5alloc5alloc18handle_alloc_error(i64 noundef %layout.0, i64 noundef %layout.1) #9 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           19:  unreachable 
check:4'0      ~~~~~~~~~~~~~
           20: } 
check:4'0      ~~
check:4'0      ~
check:4'0      ~
           22: ; <alloc::rc::Rc<virtual_function_elimination::S>>::drop_slow 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           23: ; Function Attrs: noinline nounwind nonlazybind uwtable 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           24: define internal fastcc void @_RNvMs5_NtCs3WZ5KMa5SEj_5alloc2rcINtB5_2RcNtCs64ITQYi9761_28virtual_function_elimination1SE9drop_slowBF_(ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %self) unnamed_addr #1 personality ptr @rust_eh_personality { 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~~~~~~~
check:4'0      ~~~~~~~
           26:  %_3 = load ptr, ptr %self, align 8, !nonnull !9, !noundef !9 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           27:  %_10.i.i = icmp eq ptr %_3, inttoptr (i64 1 to ptr) 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           28:  br i1 %_10.i.i, label %_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtBL_5alloc6GlobalEEB1f_.exit, label %bb7.i.i 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~
check:4'0      ~
           30: bb7.i.i: ; preds = %start 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~
           31:  %_25.i.i = getelementptr inbounds %"alloc::rc::RcCounts", ptr %_3, i64 -1 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           32:  %_27.i.i = load i64, ptr %_25.i.i, align 8, !noalias !10, !noundef !9 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           33:  %_28.0.i.i = add i64 %_27.i.i, -1 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           34:  store i64 %_28.0.i.i, ptr %_25.i.i, align 8, !alias.scope !15, !noalias !10 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           35:  %0 = icmp eq i64 %_28.0.i.i, 0 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           36:  br i1 %0, label %bb1.i.i, label %_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtBL_5alloc6GlobalEEB1f_.exit 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~
check:4'0      ~
           38: bb1.i.i: ; preds = %bb7.i.i 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           39:  tail call void @__rust_dealloc(ptr noundef nonnull %_25.i.i, i64 noundef 16, i64 noundef 8) #10, !noalias !10 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           40:  br label %_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtBL_5alloc6GlobalEEB1f_.exit 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:4'0      ~
check:4'0      ~
           42: _RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtBL_5alloc6GlobalEEB1f_.exit: ; preds = %start, %bb7.i.i, %bb1.i.i 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           43:  ret void 
check:4'0      ~~~~~~~~~~
           44: } 
check:4'0      ~~
check:4'0      ~
check:4'0      ~
           46: ; <virtual_function_elimination::S as virtual_function_elimination::T>::used 
check:4'0      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           47: ; Function Attrs: mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(none) uwtable 
           48: define internal noundef i32 @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T4usedB4_(ptr noalias nocapture nonnull readonly align 1 %self) unnamed_addr #2 { 
           50:  ret i32 1 
           51: } 
           52:  
           52:  
           53: ; <virtual_function_elimination::S as virtual_function_elimination::T>::used_through_sub_trait 
           54: ; Function Attrs: mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(none) uwtable 
           55: define internal noundef i32 @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T22used_through_sub_traitB4_(ptr noalias nocapture nonnull readonly align 1 %self) unnamed_addr #2 { 
           57:  ret i32 3 
           58: } 
           59:  
           59:  
           60: ; <virtual_function_elimination::S as virtual_function_elimination::T>::by_rc 
           61: ; Function Attrs: nounwind nonlazybind uwtable 
           62: define internal noundef i32 @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1T5by_rcB4_(ptr noundef nonnull %0) unnamed_addr #3 personality ptr @rust_eh_personality { 
           63: bb2: 
           64:  %self = alloca [8 x i8], align 8 
           65:  store ptr %0, ptr %self, align 8 
           66:  %_20.i.i2 = getelementptr %"alloc::rc::RcCounts", ptr %0, i64 -1, i32 1 
           67:  %_14.i.i3 = load i64, ptr %_20.i.i2, align 8, !noalias !18, !noundef !9 
           68:  %_15.0.i.i4 = add i64 %_14.i.i3, -1 
           69:  store i64 %_15.0.i.i4, ptr %_20.i.i2, align 8, !alias.scope !23, !noalias !18 
           70:  %1 = icmp eq i64 %_15.0.i.i4, 0 
           71:  br i1 %1, label %bb1.i.i5, label %_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc2RcNtCs64ITQYi9761_28virtual_function_elimination1SEEB1d_.exit6 
           72:  
           73: bb1.i.i5: ; preds = %bb2 
           74: ; call <alloc::rc::Rc<virtual_function_elimination::S>>::drop_slow 
           75:  call fastcc void @_RNvMs5_NtCs3WZ5KMa5SEj_5alloc2rcINtB5_2RcNtCs64ITQYi9761_28virtual_function_elimination1SE9drop_slowBF_(ptr noalias noundef nonnull align 8 dereferenceable(8) %self) 
           76:  br label %_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc2RcNtCs64ITQYi9761_28virtual_function_elimination1SEEB1d_.exit6 
           77:  
           78: _RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc2RcNtCs64ITQYi9761_28virtual_function_elimination1SEEB1d_.exit6: ; preds = %bb2, %bb1.i.i5 
           79:  ret i32 2 
           80: } 
           81:  
           82: ; <virtual_function_elimination::S as virtual_function_elimination::U>::subtrait_used 
           83: ; Function Attrs: mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(none) uwtable 
           84: define internal noundef i32 @_RNvYNtCs64ITQYi9761_28virtual_function_elimination1SNtB4_1U13subtrait_usedB4_(ptr noalias nocapture nonnull readonly align 1 %self) unnamed_addr #2 { 
           86:  ret i32 4 
           87: } 
           88:  
           88:  
           89: ; <virtual_function_elimination::S as virtual_function_elimination::V>::public_function 
           90: ; Function Attrs: mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(none) uwtable 
           91: define internal noundef i32 @_RNvXs0_Cs64ITQYi9761_28virtual_function_eliminationNtB5_1SNtB5_1V15public_function(ptr noalias nocapture nonnull readonly align 1 %self) unnamed_addr #2 { 
           93:  ret i32 6 
           94: } 
           95:  
           95:  
           96: ; virtual_function_elimination::taking_v 
           97: ; Function Attrs: nonlazybind uwtable 
           98: define noundef i32 @_RNvCs64ITQYi9761_28virtual_function_elimination8taking_v(ptr noundef nonnull align 1 %v.0, ptr noalias noundef readonly align 8 dereferenceable(32) %v.1) unnamed_addr #4 { 
           99: start: 
          100:  %0 = tail call { ptr, i1 } @llvm.type.checked.load(ptr nonnull %v.1, i32 24, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1V") 
          101:  %1 = extractvalue { ptr, i1 } %0, 0 
          102:  %_0 = tail call noundef i32 %1(ptr noundef nonnull align 1 %v.0) 
          103:  ret i32 %_0 
          104: } 
          106: ; virtual_function_elimination::main 
          106: ; virtual_function_elimination::main 
          107: ; Function Attrs: nonlazybind uwtable 
          108: define void @_RNvCs64ITQYi9761_28virtual_function_elimination4main() unnamed_addr #4 personality ptr @rust_eh_personality { 
          110:  %_1 = alloca [0 x i8], align 1 
          110:  %_1 = alloca [0 x i8], align 1 
          111:  %0 = tail call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.1, i32 24, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1T") 
          112:  %1 = extractvalue { ptr, i1 } %0, 0 
          113:  %_0.i = call noundef i32 %1(ptr noundef nonnull align 1 %_1) 
          114:  %2 = load volatile i8, ptr @__rust_no_alloc_shim_is_unstable, align 1 
          115:  %_0.i.i.i.i.i.i.i.i = call noalias noundef align 8 dereferenceable_or_null(16) ptr @__rust_alloc(i64 noundef 16, i64 noundef 8) #10 
          116:  %3 = icmp eq ptr %_0.i.i.i.i.i.i.i.i, null 
          117:  br i1 %3, label %bb3.i.i.i, label %_RNvMs7_NtCs3WZ5KMa5SEj_5alloc2rcINtB5_2RcNtCs64ITQYi9761_28virtual_function_elimination1SE6new_inBF_.exit 
          118:  
          119: bb3.i.i.i: ; preds = %start 
          120: ; call alloc::rc::polymorphic::allocate_for_layout::<<alloc::rc::UniqueRcUninit<virtual_function_elimination::S>>::allocate_unsized_in<<alloc::alloc::Global as core::alloc::Allocator>::allocate>::{closure#0}>::{closure#0} 
          121:  call fastcc void @_RNCINvNtNtCs3WZ5KMa5SEj_5alloc2rc11polymorphic19allocate_for_layoutNCINvMs1k_B6_INtB6_14UniqueRcUninitNtCs64ITQYi9761_28virtual_function_elimination1SE19allocate_unsized_inNvYNtNtB8_5alloc6GlobalNtNtCs9wfsaRGo7vI_4core5alloc9Allocator8allocateE0E0B1E_(i64 noundef 16, i64 noundef 8) #9 
          122:  unreachable 
          123:  
          124: _RNvMs7_NtCs3WZ5KMa5SEj_5alloc2rcINtB5_2RcNtCs64ITQYi9761_28virtual_function_elimination1SE6new_inBF_.exit: ; preds = %start 
          125:  %_24.i.i.i = getelementptr inbounds i8, ptr %_0.i.i.i.i.i.i.i.i, i64 16 
          126:  store i64 1, ptr %_0.i.i.i.i.i.i.i.i, align 8, !alias.scope !26 
          127:  %_43.i.i = getelementptr i8, ptr %_0.i.i.i.i.i.i.i.i, i64 8 
          128:  store i64 1, ptr %_43.i.i, align 8, !alias.scope !29 
          129:  %4 = call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.1, i32 40, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1T") 
          130:  %5 = extractvalue { ptr, i1 } %4, 0 
          131:  %_0.i1 = call noundef i32 %5(ptr noundef nonnull %_24.i.i.i) 
          132:  %6 = call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.2, i32 64, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1U") 
          133:  %7 = extractvalue { ptr, i1 } %6, 0 
          134:  %_3.i = call noundef i32 %7(ptr noundef nonnull align 1 %_1) 
          135:  %8 = call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.2, i32 24, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1U") 
          136:  %9 = extractvalue { ptr, i1 } %8, 0 
          137:  %_4.i = call noundef i32 %9(ptr noundef nonnull align 1 %_1) 
          138:  %10 = call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.2, i32 32, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1U") 
          139:  %11 = extractvalue { ptr, i1 } %10, 0 
          140:  %_5.i = call noundef i32 %11(ptr noundef nonnull align 1 %_1) 
          141:  %12 = call { ptr, i1 } @llvm.type.checked.load(ptr nonnull @vtable.3, i32 24, metadata !"NtCs64ITQYi9761_28virtual_function_elimination1V") 
check:96'0                                                                                                                                                 X error: match failed for invalid pattern
check:96'1                                                                                                                                                   undefined variable: TYPE0
check:96'2                                                                                                                                                   with "MANGLED_TYPE0" equal to "NtCs64ITQYi9761_28virtual_function_elimination1T"
          142:  %13 = extractvalue { ptr, i1 } %12, 0 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          143:  %_0.i3 = call noundef i32 %13(ptr noundef nonnull align 1 %_1) 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          144:  ret void 
check:96'0     ~~~~~~~~~~
          145: } 
check:96'0     ~~
check:96'0     ~
check:96'0     ~
          147: ; Function Attrs: nounwind nonlazybind uwtable 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          148: declare noundef i32 @rust_eh_personality(i32 noundef, i32 noundef, i64 noundef, ptr noundef, ptr noundef) unnamed_addr #3 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
          150: ; alloc::alloc::handle_alloc_error 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          151: ; Function Attrs: cold minsize noreturn nonlazybind optsize uwtable 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          152: declare void @_RNvNtCs3WZ5KMa5SEj_5alloc5alloc18handle_alloc_error(i64 noundef, i64 noundef) unnamed_addr #5 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
check:96'0     ~
          154: ; Function Attrs: nounwind nonlazybind allockind("alloc,uninitialized,aligned") allocsize(0) uwtable 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          155: declare noalias noundef ptr @__rust_alloc(i64 noundef, i64 allocalign noundef) unnamed_addr #6 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
check:96'0     ~
          157: ; Function Attrs: nounwind nonlazybind allockind("free") uwtable 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          158: declare void @__rust_dealloc(ptr allocptr noundef, i64 noundef, i64 noundef) unnamed_addr #7 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
check:96'0     ~
          160: ; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none) 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          161: declare { ptr, i1 } @llvm.type.checked.load(ptr, i32, metadata) #8 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
check:96'0     ~
          163: attributes #0 = { inlinehint noreturn nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          164: attributes #1 = { noinline nounwind nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          165: attributes #2 = { mustprogress nofree norecurse nosync nounwind nonlazybind willreturn memory(none) uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          166: attributes #3 = { nounwind nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          167: attributes #4 = { nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          168: attributes #5 = { cold minsize noreturn nonlazybind optsize uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          169: attributes #6 = { nounwind nonlazybind allockind("alloc,uninitialized,aligned") allocsize(0) uwtable "alloc-family"="__rust_alloc" "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          170: attributes #7 = { nounwind nonlazybind allockind("free") uwtable "alloc-family"="__rust_alloc" "probe-stack"="inline-asm" "target-cpu"="x86-64" } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          171: attributes #8 = { mustprogress nocallback nofree nosync nounwind willreturn memory(none) } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          172: attributes #9 = { noreturn } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          173: attributes #10 = { nounwind } 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
check:96'0     ~
          175: !llvm.module.flags = !{!5, !6, !7} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          176: !llvm.ident = !{!8} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~
check:96'0     ~
check:96'0     ~
          178: !0 = !{i64 0, !"NtCs64ITQYi9761_28virtual_function_elimination1T"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:96'3     ?                                                                   possible intended match
          179: !1 = !{i64 2} 
check:96'0     ~~~~~~~~~~~~~~
          180: !2 = !{i64 0, !"NtCs64ITQYi9761_28virtual_function_elimination1U"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          181: !3 = !{i64 0, !"NtCs64ITQYi9761_28virtual_function_elimination1V"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          182: !4 = !{i64 1} 
check:96'0     ~~~~~~~~~~~~~~
          183: !5 = !{i32 8, !"PIC Level", i32 2} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          184: !6 = !{i32 2, !"RtLibUseGOT", i32 1} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          185: !7 = !{i32 1, !"Virtual Function Elim", i32 1} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          186: !8 = !{!"rustc version 1.84.0-nightly (bc2ff49d5 2024-11-15)"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          187: !9 = !{} 
check:96'0     ~~~~~~~~~
          188: !10 = !{!11, !13} 
check:96'0     ~~~~~~~~~~~~~~~~~~
          189: !11 = distinct !{!11, !12, !"_RNvXs14_NtCs3WZ5KMa5SEj_5alloc2rcINtB6_4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtB8_5alloc6GlobalENtNtNtCs9wfsaRGo7vI_4core3ops4drop4Drop4dropBI_: %self"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          190: !12 = distinct !{!12, !"_RNvXs14_NtCs3WZ5KMa5SEj_5alloc2rcINtB6_4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtB8_5alloc6GlobalENtNtNtCs9wfsaRGo7vI_4core3ops4drop4Drop4dropBI_"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          191: !13 = distinct !{!13, !14, !"_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtBL_5alloc6GlobalEEB1f_: %_1"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          192: !14 = distinct !{!14, !"_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc4WeakNtCs64ITQYi9761_28virtual_function_elimination1SRNtNtBL_5alloc6GlobalEEB1f_"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          193: !15 = !{!16} 
check:96'0     ~~~~~~~~~~~~~
          194: !16 = distinct !{!16, !17, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination: %dest"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          195: !17 = distinct !{!17, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          196: !18 = !{!19, !21} 
check:96'0     ~~~~~~~~~~~~~~~~~~
          197: !19 = distinct !{!19, !20, !"_RNvXsr_NtCs3WZ5KMa5SEj_5alloc2rcINtB5_2RcNtCs64ITQYi9761_28virtual_function_elimination1SENtNtNtCs9wfsaRGo7vI_4core3ops4drop4Drop4dropBF_: %self"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          198: !20 = distinct !{!20, !"_RNvXsr_NtCs3WZ5KMa5SEj_5alloc2rcINtB5_2RcNtCs64ITQYi9761_28virtual_function_elimination1SENtNtNtCs9wfsaRGo7vI_4core3ops4drop4Drop4dropBF_"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          199: !21 = distinct !{!21, !22, !"_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc2RcNtCs64ITQYi9761_28virtual_function_elimination1SEEB1d_: %_1"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          200: !22 = distinct !{!22, !"_RINvNtCs9wfsaRGo7vI_4core3ptr13drop_in_placeINtNtCs3WZ5KMa5SEj_5alloc2rc2RcNtCs64ITQYi9761_28virtual_function_elimination1SEEB1d_"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          201: !23 = !{!24} 
check:96'0     ~~~~~~~~~~~~~
          202: !24 = distinct !{!24, !25, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination: %dest"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          203: !25 = distinct !{!25, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          204: !26 = !{!27} 
check:96'0     ~~~~~~~~~~~~~
          205: !27 = distinct !{!27, !28, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination: %dest"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          206: !28 = distinct !{!28, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          207: !29 = !{!30} 
check:96'0     ~~~~~~~~~~~~~
          208: !30 = distinct !{!30, !31, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination: %dest"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          209: !31 = distinct !{!31, !"_RINvNtCs9wfsaRGo7vI_4core3mem7replacejECs64ITQYi9761_28virtual_function_elimination"} 
check:96'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------



@scottmcm
Copy link
Member Author

@bors try

bors added a commit to rust-lang-ci/rust that referenced this pull request Nov 16, 2024
[DRAFT] `Rc`: allow deduping both `deref` and `clone` across types

This works by *always* putting the counts *just* before the value, rather than using an `RcInner` type at all.

By doing that, the offset to the counts are exactly the same for all types -- small or large, low alignment or high -- so `Rc::clone` can be polymorphized, and `Rc::deref` is always just a no-op.

r? ghost
@bors
Copy link
Collaborator

bors commented Nov 16, 2024

⌛ Trying commit 97b8832 with merge 711b97b...

@bors
Copy link
Collaborator

bors commented Nov 16, 2024

☀️ Try build successful - checks-actions
Build commit: 711b97b (711b97bf90d2aee030c7a76cc9bc8d16cafde658)

@scottmcm
Copy link
Member Author

@rust-timer queue

@rust-timer

This comment has been minimized.

@rustbot rustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Nov 16, 2024
@scottmcm
Copy link
Member Author

@rust-timer build 711b97b

@rust-timer

This comment has been minimized.

@rust-timer
Copy link
Collaborator

Finished benchmarking commit (711b97b): comparison URL.

Overall result: ❌✅ regressions and improvements - please read the text below

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

mean range count
Regressions ❌
(primary)
0.5% [0.1%, 1.7%] 69
Regressions ❌
(secondary)
1.8% [0.0%, 13.6%] 54
Improvements ✅
(primary)
-0.5% [-1.0%, -0.2%] 5
Improvements ✅
(secondary)
-0.3% [-1.2%, -0.1%] 4
All ❌✅ (primary) 0.4% [-1.0%, 1.7%] 74

Max RSS (memory usage)

Results (primary -3.0%, secondary 3.5%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
2.6% [2.6%, 2.6%] 1
Regressions ❌
(secondary)
4.8% [1.7%, 9.0%] 4
Improvements ✅
(primary)
-5.8% [-9.9%, -1.8%] 2
Improvements ✅
(secondary)
-1.8% [-1.8%, -1.8%] 1
All ❌✅ (primary) -3.0% [-9.9%, 2.6%] 3

Cycles

Results (primary -0.5%, secondary 3.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
0.7% [0.7%, 0.7%] 1
Regressions ❌
(secondary)
4.5% [1.1%, 22.6%] 21
Improvements ✅
(primary)
-1.1% [-1.6%, -0.7%] 2
Improvements ✅
(secondary)
-2.3% [-2.6%, -2.1%] 2
All ❌✅ (primary) -0.5% [-1.6%, 0.7%] 3

Binary size

Results (primary -0.1%, secondary 7.4%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
0.2% [0.1%, 0.4%] 8
Regressions ❌
(secondary)
8.8% [1.1%, 17.3%] 7
Improvements ✅
(primary)
-0.3% [-0.5%, -0.1%] 10
Improvements ✅
(secondary)
-2.7% [-2.7%, -2.7%] 1
All ❌✅ (primary) -0.1% [-0.5%, 0.4%] 18

Bootstrap: 788.599s -> 786.092s (-0.32%)
Artifact size: 335.45 MiB -> 335.46 MiB (0.00%)

@rustbot rustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Nov 16, 2024
@scottmcm
Copy link
Member Author

I'm going to close this and hope that @EFanZh's version (see #132553 (comment)) will pick up anything useful that I had here -- realistically I don't think I'll get back to this anytime soon, and they've made a bunch of important progress in theirs (like fixing debug visualizers) that I never did here.

@scottmcm scottmcm closed this Feb 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
perf-regression Performance regression. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants