From bcd3c1f49a85b54832c0893f0f8d974e48eb80ed Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 1 May 2020 14:00:50 +0530 Subject: [PATCH 1/2] Remove ptr comparison check before doing memcmp --- src/libcore/slice/mod.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index 7b357bb487a0a..02e6ac0e0176a 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -5859,9 +5859,6 @@ where if self.len() != other.len() { return false; } - if self.as_ptr() == other.as_ptr() { - return true; - } unsafe { let size = mem::size_of_val(self); memcmp(self.as_ptr() as *const u8, other.as_ptr() as *const u8, size) == 0 From 5c4fc12030708293d1b7fb85610562aa57e3d9b8 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sat, 2 May 2020 20:10:58 +0530 Subject: [PATCH 2/2] Add codegen test to verify pointer check is not emitted --- src/test/codegen/slice-ref-ptr-check.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/codegen/slice-ref-ptr-check.rs diff --git a/src/test/codegen/slice-ref-ptr-check.rs b/src/test/codegen/slice-ref-ptr-check.rs new file mode 100644 index 0000000000000..556e66a42fba2 --- /dev/null +++ b/src/test/codegen/slice-ref-ptr-check.rs @@ -0,0 +1,15 @@ +// ignore-tidy-linelength +// compile-flags: -C opt-level=3 + +#![crate_type = "lib"] + +// https://github.com/rust-lang/rust/issues/71602 + +// CHECK-LABEL: @is_zero_slice +#[no_mangle] +pub fn is_zero_slice(data: &[u8; 4]) -> bool { + // CHECK: start + // CHECK-NOT: %_8.i.i.i = icmp eq [4 x i8]* %data, getelementptr inbounds (<{ [4 x i8] }>, <{ [4 x i8] }>* @alloc2, i64 0, i32 0) + // CHECK: ret + *data == [0; 4] +}