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.
Metadata
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.