about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2018-07-05 14:22:09 -0700
committerJosh Stone <jistone@redhat.com>2018-07-05 14:22:09 -0700
commit557736befc84fb72066128a8c42efe6e4e63a3b1 (patch)
tree1c1b1f3db4dc7a53a04bcca1e42c745f321fc56a
parente5789765606baebd983bd9b1c870cb8b57a0627b (diff)
downloadrust-557736befc84fb72066128a8c42efe6e4e63a3b1.tar.gz
rust-557736befc84fb72066128a8c42efe6e4e63a3b1.zip
Update scalar pairs per review comments
-rw-r--r--src/librustc_codegen_llvm/mir/operand.rs6
-rw-r--r--src/librustc_codegen_llvm/mir/place.rs6
-rw-r--r--src/librustc_codegen_llvm/type_of.rs2
-rw-r--r--src/test/codegen/scalar-pair-bool.rs14
4 files changed, 17 insertions, 11 deletions
diff --git a/src/librustc_codegen_llvm/mir/operand.rs b/src/librustc_codegen_llvm/mir/operand.rs
index 3069a155d1f..5d36eef99af 100644
--- a/src/librustc_codegen_llvm/mir/operand.rs
+++ b/src/librustc_codegen_llvm/mir/operand.rs
@@ -18,7 +18,7 @@ use rustc_data_structures::indexed_vec::Idx;
 use rustc_data_structures::sync::Lrc;
 
 use base;
-use common::{self, CodegenCx, C_null, C_undef, C_usize};
+use common::{CodegenCx, C_null, C_undef, C_usize};
 use builder::{Builder, MemFlags};
 use value::Value;
 use type_of::LayoutLlvmExt;
@@ -310,10 +310,6 @@ impl<'a, 'tcx> OperandValue {
             OperandValue::Pair(a, b) => {
                 for (i, &x) in [a, b].iter().enumerate() {
                     let llptr = bx.struct_gep(dest.llval, i as u64);
-                    // Make sure to always store i1 as i8.
-                    if common::val_ty(x) == Type::i1(bx.cx) {
-                        assert_eq!(common::val_ty(llptr), Type::i8p(bx.cx));
-                    }
                     let val = base::from_immediate(bx, x);
                     bx.store_with_flags(val, llptr, dest.align, flags);
                 }
diff --git a/src/librustc_codegen_llvm/mir/place.rs b/src/librustc_codegen_llvm/mir/place.rs
index 36dcd04b02e..e7f9457a6a1 100644
--- a/src/librustc_codegen_llvm/mir/place.rs
+++ b/src/librustc_codegen_llvm/mir/place.rs
@@ -16,7 +16,7 @@ use rustc::mir::tcx::PlaceTy;
 use rustc_data_structures::indexed_vec::Idx;
 use base;
 use builder::Builder;
-use common::{CodegenCx, C_undef, C_usize, C_u8, C_u32, C_uint, C_null, C_uint_big, val_ty};
+use common::{CodegenCx, C_undef, C_usize, C_u8, C_u32, C_uint, C_null, C_uint_big};
 use consts;
 use type_of::LayoutLlvmExt;
 use type_::Type;
@@ -128,10 +128,6 @@ impl<'a, 'tcx> PlaceRef<'tcx> {
         } else if let layout::Abi::ScalarPair(ref a, ref b) = self.layout.abi {
             let load = |i, scalar: &layout::Scalar| {
                 let llptr = bx.struct_gep(self.llval, i as u64);
-                // Make sure to always load i1 as i8.
-                if scalar.is_bool() {
-                    assert_eq!(val_ty(llptr), Type::i8p(bx.cx));
-                }
                 let load = bx.load(llptr, self.align);
                 scalar_load_metadata(load, scalar);
                 if scalar.is_bool() {
diff --git a/src/librustc_codegen_llvm/type_of.rs b/src/librustc_codegen_llvm/type_of.rs
index 195f1c3b85a..0175d67803b 100644
--- a/src/librustc_codegen_llvm/type_of.rs
+++ b/src/librustc_codegen_llvm/type_of.rs
@@ -363,7 +363,7 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyLayout<'tcx> {
 
         // Make sure to return the same type `immediate_llvm_type` would when
         // dealing with an immediate pair.  This means that `(bool, bool)` is
-        // effectively represented as `{i8, i8}` in memory and `{i1, i1}` as an
+        // effectively represented as `{i8, i8}` in memory and two `i1`s as an
         // immediate, just like `bool` is typically `i8` in memory and only `i1`
         // when immediate.  We need to load/store `bool` as `i8` to avoid
         // crippling LLVM optimizations or triggering other LLVM bugs with `i1`.
diff --git a/src/test/codegen/scalar-pair-bool.rs b/src/test/codegen/scalar-pair-bool.rs
index 2078a245085..f50e032f8e6 100644
--- a/src/test/codegen/scalar-pair-bool.rs
+++ b/src/test/codegen/scalar-pair-bool.rs
@@ -38,3 +38,17 @@ pub fn pair_and_or((a, b): (bool, bool)) -> (bool, bool) {
     // CHECK: or i1 %arg0.0, %arg0.1
     (a && b, a || b)
 }
+
+// CHECK: define void @pair_branches(i1 zeroext %arg0.0, i1 zeroext %arg0.1)
+#[no_mangle]
+pub fn pair_branches((a, b): (bool, bool)) {
+    // Make sure it can branch directly on the unpacked bool args
+    // CHECK: br i1 %arg0.0
+    if a {
+        println!("Hello!");
+    }
+    // CHECK: br i1 %arg0.1
+    if b {
+        println!("Goodbye!");
+    }
+}