Introduce a fast path that avoids the debug_tuple abstraction when deriving

Debug for unit-like enum variants.

The intent here is to allow LLVM to remove the switch entirely in favor of an
indexed load from a table of constant strings, which is likely what the
programmer would write in C. Unfortunately, LLVM currently doesn't perform this
optimization due to a bug, but there is [a
patch](https://reviews.llvm.org/D109565) that fixes this issue. I've verified
that, with that patch applied on top of this commit, Debug for unit-like tuple
variants becomes a load, reducing the O(n) code bloat to O(1).

Note that inlining `DebugTuple::finish()` wasn't enough to allow LLVM to
optimize the code properly; I had to avoid the abstraction entirely. Not using
the abstraction is likely better for compile time anyway.

Part of #88793.
This commit is contained in:
Patrick Walton 2021-09-10 12:00:22 -07:00
parent 497ee321af
commit 79bc53870f
2 changed files with 18 additions and 3 deletions

View file

@ -1418,6 +1418,7 @@ symbols! {
wrapping_sub,
wreg,
write_bytes,
write_str,
x87_reg,
xer,
xmm_reg,