| //@ 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); |
| } |
| } |