@@ -26,12 +26,15 @@ pub fn swap_rgb48_manually(x: &mut RGB48, y: &mut RGB48) {
26
26
// CHECK-LABEL: @swap_rgb48
27
27
#[ no_mangle]
28
28
pub fn swap_rgb48 ( x : & mut RGB48 , y : & mut RGB48 ) {
29
- // FIXME: See #115212 for why this has an alloca again
29
+ // CHECK-NOT: alloca
30
30
31
- // CHECK: alloca [3 x i16], align 2
32
- // CHECK: call void @llvm.memcpy.p0.p0.i64({{.+}}, i64 6, i1 false)
33
- // CHECK: call void @llvm.memcpy.p0.p0.i64({{.+}}, i64 6, i1 false)
34
- // CHECK: call void @llvm.memcpy.p0.p0.i64({{.+}}, i64 6, i1 false)
31
+ // Whether `i8` is the best for this is unclear, but
32
+ // might as well record what's actually happening right now.
33
+
34
+ // CHECK: load i8
35
+ // CHECK: load i8
36
+ // CHECK: store i8
37
+ // CHECK: store i8
35
38
swap ( x, y)
36
39
}
37
40
@@ -41,10 +44,39 @@ type RGBA64 = [u16; 4];
41
44
#[ no_mangle]
42
45
pub fn swap_rgba64 ( x : & mut RGBA64 , y : & mut RGBA64 ) {
43
46
// CHECK-NOT: alloca
44
- // CHECK-DAG: %[[XVAL:.+]] = load <4 x i16>, ptr %x, align 2
45
- // CHECK-DAG: %[[YVAL:.+]] = load <4 x i16>, ptr %y, align 2
46
- // CHECK-DAG: store <4 x i16> %[[YVAL]], ptr %x, align 2
47
- // CHECK-DAG: store <4 x i16> %[[XVAL]], ptr %y, align 2
47
+ // CHECK-DAG: %[[XVAL:.+]] = load i64, ptr %x, align 2
48
+ // CHECK-DAG: %[[YVAL:.+]] = load i64, ptr %y, align 2
49
+ // CHECK-DAG: store i64 %[[YVAL]], ptr %x, align 2
50
+ // CHECK-DAG: store i64 %[[XVAL]], ptr %y, align 2
51
+ swap ( x, y)
52
+ }
53
+
54
+ // CHECK-LABEL: @swap_vecs
55
+ #[ no_mangle]
56
+ pub fn swap_vecs ( x : & mut Vec < u32 > , y : & mut Vec < u32 > ) {
57
+ // CHECK-NOT: alloca
58
+ // There are plenty more loads and stores than just these,
59
+ // but at least one sure better be 64-bit (for size or capacity).
60
+ // CHECK: load i64
61
+ // CHECK: load i64
62
+ // CHECK: store i64
63
+ // CHECK: store i64
64
+ // CHECK: ret void
65
+ swap ( x, y)
66
+ }
67
+
68
+ // CHECK-LABEL: @swap_slices
69
+ #[ no_mangle]
70
+ pub fn swap_slices < ' a > ( x : & mut & ' a [ u32 ] , y : & mut & ' a [ u32 ] ) {
71
+ // CHECK-NOT: alloca
72
+ // CHECK: load ptr
73
+ // CHECK: load i64
74
+ // CHECK: load ptr
75
+ // CHECK: load i64
76
+ // CHECK: store ptr
77
+ // CHECK: store i64
78
+ // CHECK: store ptr
79
+ // CHECK: store i64
48
80
swap ( x, y)
49
81
}
50
82
@@ -55,9 +87,9 @@ type RGB24 = [u8; 3];
55
87
// CHECK-LABEL: @swap_rgb24_slices
56
88
#[ no_mangle]
57
89
pub fn swap_rgb24_slices ( x : & mut [ RGB24 ] , y : & mut [ RGB24 ] ) {
58
- // CHECK-NOT: alloca
59
- // CHECK: load <{{[0-9]+}} x i8>
60
- // CHECK: store <{{[0-9]+}} x i8>
90
+ // CHECK-NOT: alloca
91
+ // CHECK: load <{{[0-9]+}} x i8>
92
+ // CHECK: store <{{[0-9]+}} x i8>
61
93
if x. len ( ) == y. len ( ) {
62
94
x. swap_with_slice ( y) ;
63
95
}
@@ -69,9 +101,9 @@ type RGBA32 = [u8; 4];
69
101
// CHECK-LABEL: @swap_rgba32_slices
70
102
#[ no_mangle]
71
103
pub fn swap_rgba32_slices ( x : & mut [ RGBA32 ] , y : & mut [ RGBA32 ] ) {
72
- // CHECK-NOT: alloca
73
- // CHECK: load <{{[0-9]+}} x i32>
74
- // CHECK: store <{{[0-9]+}} x i32>
104
+ // CHECK-NOT: alloca
105
+ // CHECK: load <{{[0-9]+}} x i32>
106
+ // CHECK: store <{{[0-9]+}} x i32>
75
107
if x. len ( ) == y. len ( ) {
76
108
x. swap_with_slice ( y) ;
77
109
}
@@ -84,10 +116,24 @@ const _: () = assert!(!std::mem::size_of::<String>().is_power_of_two());
84
116
// CHECK-LABEL: @swap_string_slices
85
117
#[ no_mangle]
86
118
pub fn swap_string_slices ( x : & mut [ String ] , y : & mut [ String ] ) {
87
- // CHECK-NOT: alloca
88
- // CHECK: load <{{[0-9]+}} x i64>
89
- // CHECK: store <{{[0-9]+}} x i64>
119
+ // CHECK-NOT: alloca
120
+ // CHECK: load <{{[0-9]+}} x i64>
121
+ // CHECK: store <{{[0-9]+}} x i64>
90
122
if x. len ( ) == y. len ( ) {
91
123
x. swap_with_slice ( y) ;
92
124
}
93
125
}
126
+
127
+ #[ repr( C , packed) ]
128
+ pub struct Packed {
129
+ pub first : bool ,
130
+ pub second : usize ,
131
+ }
132
+
133
+ // CHECK-LABEL: @swap_packed_structs
134
+ #[ no_mangle]
135
+ pub fn swap_packed_structs ( x : & mut Packed , y : & mut Packed ) {
136
+ // CHECK-NOT: alloca
137
+ // CHECK: ret void
138
+ swap ( x, y)
139
+ }
0 commit comments