]> git.lizzy.rs Git - rust.git/commit
Store scalar pair bools as i8 in memory
authorJosh Stone <jistone@redhat.com>
Fri, 15 Jun 2018 22:47:54 +0000 (15:47 -0700)
committerJosh Stone <jistone@redhat.com>
Thu, 5 Jul 2018 16:59:52 +0000 (09:59 -0700)
commite5789765606baebd983bd9b1c870cb8b57a0627b
tree865811bcbcead24fb5448ee44e53ae0a07370aeb
parent94eb1760551096363ec04e42367b6b195592dbd8
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.
src/librustc/ty/layout.rs
src/librustc_codegen_llvm/abi.rs
src/librustc_codegen_llvm/base.rs
src/librustc_codegen_llvm/mir/operand.rs
src/librustc_codegen_llvm/mir/place.rs
src/librustc_codegen_llvm/mir/rvalue.rs
src/librustc_codegen_llvm/type_of.rs
src/test/codegen/function-arguments.rs
src/test/codegen/scalar-pair-bool.rs [new file with mode: 0644]