mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
f4555ef5e1
Lower `Or` pattern without allocating place cc `@azizghuloum` `@cjgillot` Related to #111583 and #111644 While reviewing #111644, it occurs to me that while we directly lower conjunctive predicates, which are connected with `&&`, into the desirable control flow, today we don't directly lower the disjunctive predicates, which are connected with `||`, in the similar fashion. Instead, we allocate a place for the boolean temporary to hold the result of evaluating the `||` expression. Usually I would expect optimization at later stages to "inline" the evaluation of boolean predicates into simple CFG, but #111583 is an example where `&&` is failing to be optimized away and the assembly shows that both the expensive operands are evaluated. Therefore, I would like to make a small change to make the CFG a bit more straight-forward without invoking the `as_temp` machinery, and plus avoid allocating the place to hold the boolean result as well. |
||
---|---|---|
.. | ||
rfc-0107-bind-by-move-pattern-guards | ||
rfc-1014-stdout-existential-crisis | ||
rfc-1445-restrict-constants-in-patterns | ||
rfc-1623-static | ||
rfc-1717-dllimport | ||
rfc-1789-as-cell | ||
rfc-1857-stabilize-drop-order | ||
rfc-1937-termination-trait | ||
rfc-2005-default-binding-mode | ||
rfc-2008-non-exhaustive | ||
rfc-2027-object-safe-for-dispatch | ||
rfc-2091-track-caller | ||
rfc-2093-infer-outlives | ||
rfc-2126-crate-paths | ||
rfc-2126-extern-absolute-paths | ||
rfc-2151-raw-identifiers | ||
rfc-2175-or-if-while-let | ||
rfc-2294-if-let-guard | ||
rfc-2302-self-struct-ctor | ||
rfc-2306-convert-id | ||
rfc-2361-dbg-macro | ||
rfc-2396-target_feature-11 | ||
rfc-2397-do-not-recommend | ||
rfc-2421-unreserve-pure-offsetof-sizeof-alignof | ||
rfc-2457-non-ascii-idents | ||
rfc-2497-if-let-chains | ||
rfc-2528-type-changing-struct-update | ||
rfc-2565-param-attrs | ||
rfc-2627-raw-dylib | ||
rfc-2632-const-trait-impl | ||
rfc-3348-c-string-literals |