]>
Commit | Line | Data |
---|---|---|
04454e1e FG |
1 | // compile-flags: -O |
2 | // only-x86_64 | |
3 | // ignore-debug | |
064997fb | 4 | // min-llvm-version: 15.0 |
04454e1e FG |
5 | |
6 | #![crate_type = "lib"] | |
7 | ||
064997fb FG |
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 | ||
04454e1e FG |
45 | // CHECK-LABEL: @vec_zero_scalar |
46 | #[no_mangle] | |
47 | pub fn vec_zero_scalar(n: usize) -> Vec<i32> { | |
064997fb FG |
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 | |
04454e1e FG |
59 | vec![0; n] |
60 | } | |
61 | ||
064997fb FG |
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 | ||
04454e1e FG |
79 | // CHECK-LABEL: @vec_zero_rgb48 |
80 | #[no_mangle] | |
81 | pub fn vec_zero_rgb48(n: usize) -> Vec<[u16; 3]> { | |
064997fb FG |
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 | |
04454e1e FG |
93 | vec![[0, 0, 0]; n] |
94 | } | |
95 | ||
064997fb | 96 | // CHECK-LABEL: @vec_zero_array_16 |
04454e1e | 97 | #[no_mangle] |
064997fb FG |
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] | |
04454e1e | 111 | } |
064997fb FG |
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 | // Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away. | |
148 | // CHECK: declare noalias ptr @__rust_alloc_zeroed(i64, i64 allocalign) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]] | |
149 | ||
150 | // CHECK-DAG: attributes [[RUST_ALLOC_ZEROED_ATTRS]] = { {{.*}} allockind("alloc,zeroed,aligned") allocsize(0) uwtable "alloc-family"="__rust_alloc" {{.*}} } |