]> git.proxmox.com Git - rustc.git/blame - src/test/codegen/packed.rs
New upstream version 1.63.0+dfsg1
[rustc.git] / src / test / codegen / packed.rs
CommitLineData
cdc7bbd5
XL
1//
2// compile-flags: -O -C no-prepopulate-passes
9e0c209e 3
32a655c1 4#![crate_type = "lib"]
c30ab7b3 5
32a655c1 6#[repr(packed)]
83c7162d 7pub struct Packed1 {
32a655c1
SL
8 dealign: u8,
9 data: u32
c30ab7b3 10}
223e47cc 11
83c7162d
XL
12#[repr(packed(2))]
13pub struct Packed2 {
14 dealign: u8,
15 data: u32
16}
17
18// CHECK-LABEL: @write_pkd1
32a655c1 19#[no_mangle]
83c7162d 20pub fn write_pkd1(pkd: &mut Packed1) -> u32 {
923072b8
FG
21// CHECK: %{{.*}} = load i32, {{i32\*|ptr}} %{{.*}}, align 1
22// CHECK: store i32 42, {{i32\*|ptr}} %{{.*}}, align 1
32a655c1
SL
23 let result = pkd.data;
24 pkd.data = 42;
25 result
223e47cc 26}
8bb4bdeb 27
83c7162d
XL
28// CHECK-LABEL: @write_pkd2
29#[no_mangle]
30pub fn write_pkd2(pkd: &mut Packed2) -> u32 {
923072b8
FG
31// CHECK: %{{.*}} = load i32, {{i32\*|ptr}} %{{.*}}, align 2
32// CHECK: store i32 42, {{i32\*|ptr}} %{{.*}}, align 2
83c7162d
XL
33 let result = pkd.data;
34 pkd.data = 42;
35 result
36}
37
8bb4bdeb
XL
38pub struct Array([i32; 8]);
39#[repr(packed)]
83c7162d
XL
40pub struct BigPacked1 {
41 dealign: u8,
42 data: Array
43}
44
45#[repr(packed(2))]
46pub struct BigPacked2 {
8bb4bdeb
XL
47 dealign: u8,
48 data: Array
49}
50
83c7162d 51// CHECK-LABEL: @call_pkd1
8bb4bdeb 52#[no_mangle]
83c7162d 53pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 {
8bb4bdeb 54// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array
923072b8
FG
55// CHECK: call void %{{.*}}({{%Array\*|ptr}} noalias nocapture noundef sret{{.*}} dereferenceable(32) [[ALLOCA]])
56// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false)
8bb4bdeb
XL
57 // check that calls whose destination is a field of a packed struct
58 // go through an alloca rather than calling the function with an
59 // unaligned destination.
83c7162d
XL
60 BigPacked1 { dealign: 0, data: f() }
61}
62
63// CHECK-LABEL: @call_pkd2
64#[no_mangle]
65pub fn call_pkd2(f: fn() -> Array) -> BigPacked2 {
66// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array
923072b8
FG
67// CHECK: call void %{{.*}}({{%Array\*|ptr}} noalias nocapture noundef sret{{.*}} dereferenceable(32) [[ALLOCA]])
68// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 2 %{{.*}}, {{i8\*|ptr}} align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false)
83c7162d
XL
69 // check that calls whose destination is a field of a packed struct
70 // go through an alloca rather than calling the function with an
71 // unaligned destination.
72 BigPacked2 { dealign: 0, data: f() }
8bb4bdeb
XL
73}
74
69743fb6 75// CHECK-LABEL: @write_packed_array1
923072b8
FG
76// CHECK: store i32 0, {{i32\*|ptr}} %{{.+}}, align 1
77// CHECK: store i32 1, {{i32\*|ptr}} %{{.+}}, align 1
78// CHECK: store i32 2, {{i32\*|ptr}} %{{.+}}, align 1
69743fb6
XL
79#[no_mangle]
80pub fn write_packed_array1(p: &mut BigPacked1) {
81 p.data.0[0] = 0;
82 p.data.0[1] = 1;
83 p.data.0[2] = 2;
84}
85
86// CHECK-LABEL: @write_packed_array2
923072b8
FG
87// CHECK: store i32 0, {{i32\*|ptr}} %{{.+}}, align 2
88// CHECK: store i32 1, {{i32\*|ptr}} %{{.+}}, align 2
89// CHECK: store i32 2, {{i32\*|ptr}} %{{.+}}, align 2
69743fb6
XL
90#[no_mangle]
91pub fn write_packed_array2(p: &mut BigPacked2) {
92 p.data.0[0] = 0;
93 p.data.0[1] = 1;
94 p.data.0[2] = 2;
95}
96
97// CHECK-LABEL: @repeat_packed_array1
923072b8 98// CHECK: store i32 42, {{i32\*|ptr}} %{{.+}}, align 1
69743fb6
XL
99#[no_mangle]
100pub fn repeat_packed_array1(p: &mut BigPacked1) {
101 p.data.0 = [42; 8];
102}
103
104// CHECK-LABEL: @repeat_packed_array2
923072b8 105// CHECK: store i32 42, {{i32\*|ptr}} %{{.+}}, align 2
69743fb6
XL
106#[no_mangle]
107pub fn repeat_packed_array2(p: &mut BigPacked2) {
108 p.data.0 = [42; 8];
109}
110
8bb4bdeb
XL
111#[repr(packed)]
112#[derive(Copy, Clone)]
83c7162d 113pub struct Packed1Pair(u8, u32);
8bb4bdeb 114
83c7162d
XL
115#[repr(packed(2))]
116#[derive(Copy, Clone)]
117pub struct Packed2Pair(u8, u32);
118
119// CHECK-LABEL: @pkd1_pair
8bb4bdeb 120#[no_mangle]
83c7162d 121pub fn pkd1_pair(pair1: &mut Packed1Pair, pair2: &mut Packed1Pair) {
923072b8 122// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 1 %{{.*}}, i{{[0-9]+}} 5, i1 false)
8bb4bdeb
XL
123 *pair2 = *pair1;
124}
abe05a73 125
83c7162d
XL
126// CHECK-LABEL: @pkd2_pair
127#[no_mangle]
128pub fn pkd2_pair(pair1: &mut Packed2Pair, pair2: &mut Packed2Pair) {
923072b8 129// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 2 %{{.*}}, {{i8\*|ptr}} align 2 %{{.*}}, i{{[0-9]+}} 6, i1 false)
83c7162d
XL
130 *pair2 = *pair1;
131}
132
abe05a73
XL
133#[repr(packed)]
134#[derive(Copy, Clone)]
83c7162d
XL
135pub struct Packed1NestedPair((u32, u32));
136
137#[repr(packed(2))]
138#[derive(Copy, Clone)]
139pub struct Packed2NestedPair((u32, u32));
abe05a73 140
83c7162d 141// CHECK-LABEL: @pkd1_nested_pair
abe05a73 142#[no_mangle]
83c7162d 143pub fn pkd1_nested_pair(pair1: &mut Packed1NestedPair, pair2: &mut Packed1NestedPair) {
923072b8 144// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 1 %{{.*}}, i{{[0-9]+}} 8, i1 false)
abe05a73
XL
145 *pair2 = *pair1;
146}
83c7162d
XL
147
148// CHECK-LABEL: @pkd2_nested_pair
149#[no_mangle]
150pub fn pkd2_nested_pair(pair1: &mut Packed2NestedPair, pair2: &mut Packed2NestedPair) {
923072b8 151// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 2 %{{.*}}, {{i8\*|ptr}} align 2 %{{.*}}, i{{[0-9]+}} 8, i1 false)
83c7162d
XL
152 *pair2 = *pair1;
153}