Open tesuji opened 4 years ago
cc @nikic @cuviper as you are often involved in these issues.
This is most likely related to the fact that Rust\LLVM doesn't optimize out unused match
branches for non-inline functions: https://rust.godbolt.org/z/TPY69b
As you can see, both the code and data for all five variants are present even though only two of them are ever used.
In C++ the story is the same on clang and MSVC, but GCC does optimize those out with -O3
:
https://godbolt.org/z/G6T9Y8
EDIT: In Rust example the unused branches are removed on nightly, could be https://github.com/rust-lang/rust/pull/81451
Do edits trigger notifications? Aka did @tesuji get notified of this edit 20 hours ago? If so, sorry for the double ping.
EDIT: this is now reasonably optimized: https://rust.godbolt.org/z/nP599MaKM So it just needs tests: @rustbot label +E-needs-test
I tried this code: https://rust.godbolt.org/z/hP3YKe
The code below does not compile because I strip some code, try the godbolt link above:
I expected to see this happen: The generated code of
is_line_doc_comment
should be optimized out useless branches. And it should be equivalent to this function:How would the two
is_line_doc_comment
functions be able to generate the same code?When
doc_comment_kind
inlined inis_line_doc_comment
, the optimizer could see thatSome((DocCommentKind::Block, _))
branches are useless and remove itis_line_doc_comment
doesn't care aboutAttrStyle
,The first branch overlaps with second branch of
DocCommentKind::Line
branches, keep this branch.Other
None
branches don't overlap, just make them as fallback:Final result: https://rust.godbolt.org/z/jrPGr7
Instead, this happened: The generated code still keeps some useless branches. Maybe I am just asking too much from optimizer.
Meta
rustc --version --verbose
: