Closed
Description
I would expect this function to be ideally optimized to a no-op:
#[inline(never)]
fn foo<T>(t: &Rc<T>) {
drop(t.clone());
}
However, when invoked with Rc<int>
, we generate the following optimized IR
; Function Attrs: noinline nounwind uwtable
define internal fastcc void @_ZN3foo20h529f5691b0db4704gaa4v0.0E(%"struct.std::rc::Rc<int>[#1]"* nocapture readonly) unnamed_addr #3 {
entry-block:
%1 = getelementptr inbounds %"struct.std::rc::Rc<int>[#1]"* %0, i64 0, i32 0
%2 = load %"struct.std::rc::RcBox<int>[#1]"** %1, align 8
%3 = getelementptr inbounds %"struct.std::rc::RcBox<int>[#1]"* %2, i64 0, i32 1
%4 = load i64* %3, align 8
%5 = add i64 %4, 1
store i64 %5, i64* %3, align 8
%6 = load %"struct.std::rc::RcBox<int>[#1]"** %1, align 8
%7 = icmp eq %"struct.std::rc::RcBox<int>[#1]"* %6, null
br i1 %7, label %_ZN3mem4drop20hf8ea12715443e741vda4v0.0E.exit, label %then-block-241-.i.i.i
then-block-241-.i.i.i: ; preds = %entry-block
%8 = getelementptr inbounds %"struct.std::rc::RcBox<int>[#1]"* %6, i64 0, i32 1
%9 = load i64* %8, align 8
%10 = add i64 %9, -1
store i64 %10, i64* %8, align 8
%11 = icmp eq i64 %10, 0
br i1 %11, label %then-block-262-.i.i.i, label %_ZN3mem4drop20hf8ea12715443e741vda4v0.0E.exit
then-block-262-.i.i.i: ; preds = %then-block-241-.i.i.i
%12 = getelementptr inbounds %"struct.std::rc::RcBox<int>[#1]"* %6, i64 0, i32 2
%13 = load i64* %12, align 8
%14 = add i64 %13, -1
store i64 %14, i64* %12, align 8
%15 = icmp eq i64 %14, 0
br i1 %15, label %then-block-270-.i.i.i, label %_ZN3mem4drop20hf8ea12715443e741vda4v0.0E.exit
then-block-270-.i.i.i: ; preds = %then-block-262-.i.i.i
%16 = bitcast %"struct.std::rc::RcBox<int>[#1]"* %6 to i8*
tail call void @free(i8* %16) #2
br label %_ZN3mem4drop20hf8ea12715443e741vda4v0.0E.exit
_ZN3mem4drop20hf8ea12715443e741vda4v0.0E.exit: ; preds = %entry-block, %then-block-241-.i.i.i, %then-block-262-.i.i.i, %then-block-270-.i.i.i
ret void
}
I would expect that we would be able to do better.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Metadata
Assignees
Labels
Area: Code generationCategory: An issue proposing an enhancement or a PR with one.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Issue: Problems and improvements with respect to performance of generated code.Relevant to the library API team, which will review and decide on the PR/issue.