about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2021-01-26 13:42:40 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2021-01-26 14:49:35 +0100
commitc1c06f3e3f7bbe7336709f2b4749e969b44c0dbb (patch)
tree1c94252bbf71bc6a38e563d83dfb8042c56ef94c
parenteb99ea51421a142099f0670156f4ee5353013da9 (diff)
downloadrust-c1c06f3e3f7bbe7336709f2b4749e969b44c0dbb.tar.gz
rust-c1c06f3e3f7bbe7336709f2b4749e969b44c0dbb.zip
Use PassMode::Direct for Abi::Aggregate by default
-rw-r--r--compiler/rustc_middle/src/ty/layout.rs7
-rw-r--r--compiler/rustc_target/src/abi/call/mod.rs4
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 }
     }