about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAustin Hicks <camlorn@camlorn.net>2016-11-21 20:38:47 -0500
committerAustin Hicks <camlorn@camlorn.net>2016-12-14 12:28:22 -0500
commitcb21cc5607557538ffff8be2213e522feb527080 (patch)
treea93b348c74ba692539725308b60a3605b0f777b2
parent1af8e146f117efe7cfc1cdf7136068747d3b552c (diff)
downloadrust-cb21cc5607557538ffff8be2213e522feb527080.tar.gz
rust-cb21cc5607557538ffff8be2213e522feb527080.zip
Don't optimize pairs
-rw-r--r--src/librustc/ty/layout.rs9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs
index 87f6d6fc6e1..6d7625bf15d 100644
--- a/src/librustc/ty/layout.rs
+++ b/src/librustc/ty/layout.rs
@@ -549,9 +549,14 @@ impl<'a, 'gcx, 'tcx> Struct {
             min_size: Size::from_bytes(0),
         };
 
+        // 1-member and 2-member structs don't optimize.
+        // In addition, large bodies of code in trans assume that 2-element structs can become pairs.
+        // It's easier to just short-circuit here.
+        let can_optimize_struct = fields.len() > 2;
+
         let (optimize, sort_ascending) = match (repr, kind) {
-            (attr::ReprAny, StructKind::AlwaysSizedUnivariant) => (true, false),
-            (attr::ReprAny, StructKind::MaybeUnsizedUnivariant) => (true, true),
+            (attr::ReprAny, StructKind::AlwaysSizedUnivariant) => (can_optimize_struct, false),
+            (attr::ReprAny, StructKind::MaybeUnsizedUnivariant) => (can_optimize_struct, true),
             (attr::ReprAny, StructKind::EnumVariant) => {
                 assert!(fields.len() >= 1, "Enum variants must have discriminants.");
                 (true, fields[0].size(dl).bytes() == 1)