]> git.lizzy.rs Git - rust.git/blob - tests/codegen/vec-calloc.rs
Rollup merge of #107700 - jyn514:tools-builder, r=Mark-Simulacrum
[rust.git] / tests / codegen / vec-calloc.rs
1 // compile-flags: -O -Z merge-functions=disabled
2 // only-x86_64
3 // ignore-debug
4 // min-llvm-version: 15.0
5
6 #![crate_type = "lib"]
7
8 // CHECK-LABEL: @vec_zero_bytes
9 #[no_mangle]
10 pub fn vec_zero_bytes(n: usize) -> Vec<u8> {
11     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
12     // CHECK-NOT: call {{.*}}reserve
13     // CHECK-NOT: call {{.*}}__rust_alloc(
14     // CHECK-NOT: call {{.*}}llvm.memset
15
16     // CHECK: call {{.*}}__rust_alloc_zeroed(
17
18     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
19     // CHECK-NOT: call {{.*}}reserve
20     // CHECK-NOT: call {{.*}}__rust_alloc(
21     // CHECK-NOT: call {{.*}}llvm.memset
22
23     // CHECK: ret void
24     vec![0; n]
25 }
26
27 // CHECK-LABEL: @vec_one_bytes
28 #[no_mangle]
29 pub fn vec_one_bytes(n: usize) -> Vec<u8> {
30     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
31     // CHECK-NOT: call {{.*}}reserve
32     // CHECK-NOT: call {{.*}}__rust_alloc_zeroed(
33
34     // CHECK: call {{.*}}__rust_alloc(
35     // CHECK: call {{.*}}llvm.memset
36
37     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
38     // CHECK-NOT: call {{.*}}reserve
39     // CHECK-NOT: call {{.*}}__rust_alloc_zeroed(
40
41     // CHECK: ret void
42     vec![1; n]
43 }
44
45 // CHECK-LABEL: @vec_zero_scalar
46 #[no_mangle]
47 pub fn vec_zero_scalar(n: usize) -> Vec<i32> {
48     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
49     // CHECK-NOT: call {{.*}}reserve
50     // CHECK-NOT: call {{.*}}__rust_alloc(
51
52     // CHECK: call {{.*}}__rust_alloc_zeroed(
53
54     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
55     // CHECK-NOT: call {{.*}}reserve
56     // CHECK-NOT: call {{.*}}__rust_alloc(
57
58     // CHECK: ret void
59     vec![0; n]
60 }
61
62 // CHECK-LABEL: @vec_one_scalar
63 #[no_mangle]
64 pub fn vec_one_scalar(n: usize) -> Vec<i32> {
65     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
66     // CHECK-NOT: call {{.*}}reserve
67     // CHECK-NOT: call {{.*}}__rust_alloc_zeroed(
68
69     // CHECK: call {{.*}}__rust_alloc(
70
71     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
72     // CHECK-NOT: call {{.*}}reserve
73     // CHECK-NOT: call {{.*}}__rust_alloc_zeroed(
74
75     // CHECK: ret void
76     vec![1; n]
77 }
78
79 // CHECK-LABEL: @vec_zero_rgb48
80 #[no_mangle]
81 pub fn vec_zero_rgb48(n: usize) -> Vec<[u16; 3]> {
82     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
83     // CHECK-NOT: call {{.*}}reserve
84     // CHECK-NOT: call {{.*}}__rust_alloc(
85
86     // CHECK: call {{.*}}__rust_alloc_zeroed(
87
88     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
89     // CHECK-NOT: call {{.*}}reserve
90     // CHECK-NOT: call {{.*}}__rust_alloc(
91
92     // CHECK: ret void
93     vec![[0, 0, 0]; n]
94 }
95
96 // CHECK-LABEL: @vec_zero_array_16
97 #[no_mangle]
98 pub fn vec_zero_array_16(n: usize) -> Vec<[i64; 16]> {
99     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
100     // CHECK-NOT: call {{.*}}reserve
101     // CHECK-NOT: call {{.*}}__rust_alloc(
102
103     // CHECK: call {{.*}}__rust_alloc_zeroed(
104
105     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
106     // CHECK-NOT: call {{.*}}reserve
107     // CHECK-NOT: call {{.*}}__rust_alloc(
108
109     // CHECK: ret void
110     vec![[0_i64; 16]; n]
111 }
112
113 // CHECK-LABEL: @vec_zero_tuple
114 #[no_mangle]
115 pub fn vec_zero_tuple(n: usize) -> Vec<(i16, u8, char)> {
116     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
117     // CHECK-NOT: call {{.*}}reserve
118     // CHECK-NOT: call {{.*}}__rust_alloc(
119
120     // CHECK: call {{.*}}__rust_alloc_zeroed(
121
122     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
123     // CHECK-NOT: call {{.*}}reserve
124     // CHECK-NOT: call {{.*}}__rust_alloc(
125
126     // CHECK: ret void
127     vec![(0, 0, '\0'); n]
128 }
129
130 // CHECK-LABEL: @vec_non_zero_tuple
131 #[no_mangle]
132 pub fn vec_non_zero_tuple(n: usize) -> Vec<(i16, u8, char)> {
133     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
134     // CHECK-NOT: call {{.*}}reserve
135     // CHECK-NOT: call {{.*}}__rust_alloc_zeroed(
136
137     // CHECK: call {{.*}}__rust_alloc(
138
139     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
140     // CHECK-NOT: call {{.*}}reserve
141     // CHECK-NOT: call {{.*}}__rust_alloc_zeroed(
142
143     // CHECK: ret void
144     vec![(0, 0, 'A'); n]
145 }
146
147 // CHECK-LABEL: @vec_option_bool
148 #[no_mangle]
149 pub fn vec_option_bool(n: usize) -> Vec<Option<bool>> {
150     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
151     // CHECK-NOT: call {{.*}}reserve
152     // CHECK-NOT: call {{.*}}__rust_alloc(
153
154     // CHECK: call {{.*}}__rust_alloc_zeroed(
155
156     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
157     // CHECK-NOT: call {{.*}}reserve
158     // CHECK-NOT: call {{.*}}__rust_alloc(
159
160     // CHECK: ret void
161     vec![Some(false); n]
162 }
163
164 // CHECK-LABEL: @vec_option_i32
165 #[no_mangle]
166 pub fn vec_option_i32(n: usize) -> Vec<Option<i32>> {
167     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
168     // CHECK-NOT: call {{.*}}reserve
169     // CHECK-NOT: call {{.*}}__rust_alloc(
170
171     // CHECK: call {{.*}}__rust_alloc_zeroed(
172
173     // CHECK-NOT: call {{.*}}alloc::vec::from_elem
174     // CHECK-NOT: call {{.*}}reserve
175     // CHECK-NOT: call {{.*}}__rust_alloc(
176
177     // CHECK: ret void
178     vec![None; n]
179 }
180
181 // Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away.
182 // CHECK: declare noalias noundef ptr @__rust_alloc_zeroed(i64 noundef, i64 allocalign noundef) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]]
183
184 // CHECK-DAG: attributes [[RUST_ALLOC_ZEROED_ATTRS]] = { {{.*}} allockind("alloc,zeroed,aligned") allocsize(0) uwtable "alloc-family"="__rust_alloc" {{.*}} }