Store scalar pair bools as i8 in memory
We represent `bool` as `i1` in a `ScalarPair`, unlike other aggregates,
to optimize IR for checked operators and the like. With this patch, we
still do so when the pair is an immediate value, but we use the `i8`
memory type when the value is loaded or stored as an LLVM aggregate.
So `(bool, bool)` looks like an `{ i1, i1 }` immediate, but `{ i8, i8 }`
in memory. When a pair is a direct function argument, `PassMode::Pair`,
it is still passed using the immediate `i1` type, but as a return value
it will use the `i8` memory type. Also, `bool`-like` enum tags will now
use scalar pairs when possible, where they were previously excluded due
to optimization issues.
Fixes #51516.
Closes #51566.
r? @eddyb
cc @nox
|
||
|---|---|---|
| .. | ||
| back | ||
| debuginfo | ||
| mir | ||
| abi.rs | ||
| allocator.rs | ||
| asm.rs | ||
| attributes.rs | ||
| base.rs | ||
| build.rs | ||
| builder.rs | ||
| callee.rs | ||
| Cargo.toml | ||
| common.rs | ||
| consts.rs | ||
| context.rs | ||
| declare.rs | ||
| diagnostics.rs | ||
| glue.rs | ||
| intrinsic.rs | ||
| lib.rs | ||
| llvm_util.rs | ||
| metadata.rs | ||
| meth.rs | ||
| mono_item.rs | ||
| README.md | ||
| type_.rs | ||
| type_of.rs | ||
| value.rs | ||
The codegen crate contains the code to convert from MIR into LLVM IR,
and then from LLVM IR into machine code. In general it contains code
that runs towards the end of the compilation process.
For more information about how codegen works, see the rustc guide.