diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2021-01-26 13:42:40 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2021-01-26 14:49:35 +0100 |
| commit | c1c06f3e3f7bbe7336709f2b4749e969b44c0dbb (patch) | |
| tree | 1c94252bbf71bc6a38e563d83dfb8042c56ef94c | |
| parent | eb99ea51421a142099f0670156f4ee5353013da9 (diff) | |
| download | rust-c1c06f3e3f7bbe7336709f2b4749e969b44c0dbb.tar.gz rust-c1c06f3e3f7bbe7336709f2b4749e969b44c0dbb.zip | |
Use PassMode::Direct for Abi::Aggregate by default
| -rw-r--r-- | compiler/rustc_middle/src/ty/layout.rs | 7 | ||||
| -rw-r--r-- | compiler/rustc_target/src/abi/call/mod.rs | 4 |
2 files changed, 5 insertions, 6 deletions
diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index ef467ed6514..4ce908bdd64 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -2843,10 +2843,9 @@ where let max_by_val_size = Pointer.size(cx) * 2; let size = arg.layout.size; - let is_indirect_not_on_stack = - matches!(arg.mode, PassMode::Indirect { on_stack: false, .. }); - assert!(is_indirect_not_on_stack, "{:?}", arg); - if !arg.layout.is_unsized() && size <= max_by_val_size { + if arg.layout.is_unsized() || size > max_by_val_size { + arg.make_indirect(); + } else { // We want to pass small aggregates as immediates, but using // a LLVM aggregate type for this leads to bad optimizations, // so we pick an appropriately sized integer type instead. diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs index 2cbd52bf3e9..aa1c31bda54 100644 --- a/compiler/rustc_target/src/abi/call/mod.rs +++ b/compiler/rustc_target/src/abi/call/mod.rs @@ -32,7 +32,7 @@ pub enum PassMode { Ignore, /// Pass the argument directly. /// - /// The argument has a layout abi of `Scalar` or `Vector`. + /// The argument has a layout abi of `Scalar`, `Vector` or in rare cases `Aggregate`. Direct(ArgAttributes), /// Pass a pair's elements directly in two arguments. /// @@ -453,7 +453,7 @@ impl<'a, Ty> ArgAbi<'a, Ty> { scalar_attrs(&layout, b, a.value.size(cx).align_to(b.value.align(cx).abi)), ), Abi::Vector { .. } => PassMode::Direct(ArgAttributes::new()), - Abi::Aggregate { .. } => Self::indirect_pass_mode(&layout), + Abi::Aggregate { .. } => PassMode::Direct(ArgAttributes::new()), }; ArgAbi { layout, pad: None, mode } } |
