Skip to content

Commit bb01b5a

Browse files
committed
add inline attribute and codegen test
1 parent 2eaeae6 commit bb01b5a

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

library/core/src/slice/rotate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type BufType = [usize; 32];
1010
/// # Safety
1111
///
1212
/// The specified range must be valid for reading and writing.
13+
#[inline]
1314
pub(super) unsafe fn ptr_rotate<T>(left: usize, mid: *mut T, right: usize) {
1415
if T::IS_ZST {
1516
return;
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//@ compile-flags: -O -Cllvm-args=--inline-threshold=346
2+
3+
#![crate_type = "lib"]
4+
5+
// Ensure that the simple case of rotating by a constant 1 optimizes to the obvious thing
6+
7+
// CHECK-LABEL: @rotate_left_by_one
8+
#[no_mangle]
9+
pub fn rotate_left_by_one(slice: &mut [i32]) {
10+
// CHECK-NOT: phi
11+
// CHECK-NOT: call
12+
// CHECK-NOT: load
13+
// CHECK-NOT: store
14+
// CHECK-NOT: getelementptr
15+
// CHECK: %[[END:.+]].i = getelementptr inbounds i8, ptr %slice.0
16+
// CHECK-NEXT: %dim.i.i.i = getelementptr inbounds i32, ptr %slice.0
17+
// CHECK-NEXT: %[[LAST:.+]] = load i32, ptr %slice.0
18+
// CHECK-NEXT: %[[FIRST:.+]] = shl i64 %k.i, 2
19+
// CHECK-NEXT: call void @llvm.memmove
20+
// CHECK-NEXT: store i32 %[[LAST]], ptr %dim.i.i
21+
// CHECK-NOT: phi
22+
// CHECK-NOT: call
23+
// CHECK-NOT: load
24+
// CHECK-NOT: store
25+
// CHECK-NOT: getelementptr
26+
// CHECK: ret void
27+
if !slice.is_empty() {
28+
slice.rotate_left(1);
29+
}
30+
}
31+
32+
// CHECK-LABEL: @rotate_right_by_one
33+
#[no_mangle]
34+
pub fn rotate_right_by_one(slice: &mut [i32]) {
35+
// CHECK-NOT: phi
36+
// CHECK-NOT: call
37+
// CHECK-NOT: load
38+
// CHECK-NOT: store
39+
// CHECK-NOT: getelementptr
40+
// CHECK: %[[END:.+]].i = getelementptr inbounds i32, ptr %slice.0
41+
// CHECK-NOT: phi
42+
// CHECK-NOT: call
43+
// CHECK-NOT: load
44+
// CHECK-NOT: store
45+
// CHECK-NOT: getelementptr
46+
// CHECK: %dim.i.i.i = getelementptr inbounds i8, ptr %slice.0
47+
// CHECK-NOT: phi
48+
// CHECK-NOT: call
49+
// CHECK-NOT: load
50+
// CHECK-NOT: store
51+
// CHECK-NOT: getelementptr
52+
// CHECK: %[[TWO_LAST:.+]] = load i32, ptr %slice.0
53+
// CHECK-NEXT: %[[TWO_FIRST:.+]] = load i32, ptr %[[END]].i
54+
// CHECK-NEXT: store i32 %[[TWO_FIRST]], ptr %slice.0
55+
// CHECK-NEXT: store i32 %[[TWO_LAST]], ptr %dim.i.i
56+
// CHECK-NOT: phi
57+
// CHECK-NOT: call
58+
// CHECK-NOT: load
59+
// CHECK-NOT: store
60+
// CHECK-NOT: getelementptr
61+
// CHECK: %[[FIRST:.+]] = load i32, ptr %[[END]].i
62+
// CHECK-NEXT: %[[LAST:.+]] = shl i64 %mid.i, 2
63+
// CHECK-NEXT: call void @llvm.memmove
64+
// CHECK-NEXT: store i32 %[[FIRST]], ptr %slice.0
65+
// CHECK-NOT: phi
66+
// CHECK-NOT: call
67+
// CHECK-NOT: load
68+
// CHECK-NOT: store
69+
// CHECK-NOT: getelementptr
70+
// CHECK: ret void
71+
if !slice.is_empty() {
72+
slice.rotate_right(1);
73+
}
74+
}

0 commit comments

Comments
 (0)