Add #[loop_match]
for improved DFA codegen by folkertdev · Pull Request #138780 · rust-lang/rust (original) (raw)
tracking issue: #132306
project goal: rust-lang/rust-project-goals#258
This PR adds the #[loop_match]
attribute, which aims to improve code generation for state machines. For some (very exciting) benchmarks, see rust-lang/rust-project-goals#258 (comment)
Currently, a very restricted syntax pattern is accepted. We'd like to get feedback and merge this now before we go too far in a direction that others have concerns with.
current state
We accept code that looks like this
#[loop_match] loop { state = 'blk: { match state { State::A => { #[const_continue] break 'blk State::B } State::B => { /* ... / } / ... */ } } }
- a loop should have the same semantics with and without
#[loop_match]
: normalcontinue
andbreak
continue to work #[const_continue]
is only allowed in loops annotated with#[loop_match]
- the loop body needs to have this particular shape (a single assignment to the match scrutinee, with the body a labelled block containing just a match)
future work
- perform const evaluation on the
break
value - support more state/scrutinee types
maybe future work
- allow
continue 'label value
syntax, which#[const_continue]
could then use. - allow the match to be on an arbitrary expression (e.g.
State::Initial
) - attempt to also optimize
break
/continue
expressions that are not marked with#[const_continue]
r? @traviscross