| //@ compile-flags: -Copt-level=3 | |
| #![crate_type = "lib"] | |
| // Ensure that the simple case of rotating by a constant 1 optimizes to the obvious thing | |
| // CHECK-LABEL: @rotate_left_by_one | |
| #[no_mangle] | |
| pub fn rotate_left_by_one(slice: &mut [i32]) { | |
| // CHECK-NOT: phi | |
| // CHECK-NOT: call | |
| // CHECK-NOT: load | |
| // CHECK-NOT: store | |
| // CHECK-NOT: getelementptr | |
| // CHECK: %[[END:.+]] = getelementptr | |
| // CHECK-NEXT: %[[DIM:.+]] = getelementptr | |
| // CHECK-NEXT: %[[LAST:.+]] = load | |
| // CHECK-NEXT: %[[FIRST:.+]] = shl | |
| // CHECK-NEXT: call void @llvm.memmove | |
| // CHECK-NEXT: store i32 %[[LAST]], ptr %[[DIM:.+]] | |
| // CHECK-NOT: phi | |
| // CHECK-NOT: call | |
| // CHECK-NOT: load | |
| // CHECK-NOT: store | |
| // CHECK-NOT: getelementptr | |
| // CHECK: ret void | |
| if !slice.is_empty() { | |
| slice.rotate_left(1); | |
| } | |
| } |