about summary refs log tree commit diff
path: root/src/test/codegen
diff options
context:
space:
mode:
authorErik Desjardins <erikdesjardins@users.noreply.github.com>2020-06-15 18:19:54 -0400
committerErik Desjardins <erikdesjardins@users.noreply.github.com>2020-06-15 18:19:54 -0400
commite0975b9b0150118d376ea19908cc9bfdf400bfd5 (patch)
tree79a37123c2a03d23a2f7c9e121eb760b88846648 /src/test/codegen
parent0906066ae7d8a5e217e8cbf7f17de78a00d4ed83 (diff)
downloadrust-e0975b9b0150118d376ea19908cc9bfdf400bfd5.tar.gz
rust-e0975b9b0150118d376ea19908cc9bfdf400bfd5.zip
elaborate, add check for exact bounds
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/issue-69101-bounds-check.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/test/codegen/issue-69101-bounds-check.rs b/src/test/codegen/issue-69101-bounds-check.rs
index cdbe51da03c..cf062b6ad75 100644
--- a/src/test/codegen/issue-69101-bounds-check.rs
+++ b/src/test/codegen/issue-69101-bounds-check.rs
@@ -2,6 +2,12 @@
 // compile-flags: -O
 #![crate_type = "lib"]
 
+// Make sure no bounds checks are emitted in the loop when upfront slicing
+// ensures that the slices are big enough.
+// In particular, bounds checks were not always optimized out if the upfront
+// check was for a greater len than the loop requires.
+// (i.e. `already_sliced_no_bounds_check` was not always optimized even when
+// `already_sliced_no_bounds_check_exact` was)
 // CHECK-LABEL: @already_sliced_no_bounds_check
 #[no_mangle]
 pub fn already_sliced_no_bounds_check(a: &[u8], b: &[u8], c: &mut [u8]) {
@@ -13,7 +19,18 @@ pub fn already_sliced_no_bounds_check(a: &[u8], b: &[u8], c: &mut [u8]) {
     }
 }
 
-// make sure we're checking for the right thing: there can be a panic if the slice is too small
+// CHECK-LABEL: @already_sliced_no_bounds_check_exact
+#[no_mangle]
+pub fn already_sliced_no_bounds_check_exact(a: &[u8], b: &[u8], c: &mut [u8]) {
+    // CHECK: slice_index_len_fail
+    // CHECK-NOT: panic_bounds_check
+    let _ = (&a[..1024], &b[..1024], &mut c[..1024]);
+    for i in 0..1024 {
+        c[i] = a[i] ^ b[i];
+    }
+}
+
+// Make sure we're checking for the right thing: there can be a panic if the slice is too small.
 // CHECK-LABEL: @already_sliced_bounds_check
 #[no_mangle]
 pub fn already_sliced_bounds_check(a: &[u8], b: &[u8], c: &mut [u8]) {