]> git.proxmox.com Git - rustc.git/blame - tests/mir-opt/lower_intrinsics.rs
New upstream version 1.76.0+dfsg1
[rustc.git] / tests / mir-opt / lower_intrinsics.rs
CommitLineData
f2b60f7d 1// unit-test: LowerIntrinsics
fe692bf9 2// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
f2b60f7d 3
353b0b11 4#![feature(core_intrinsics, intrinsics, rustc_attrs)]
fc512014
XL
5#![crate_type = "lib"]
6
7// EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff
04454e1e 8pub fn wrapping(a: i32, b: i32) {
ed00b5ec
FG
9 // CHECK-LABEL: fn wrapping(
10 // CHECK: {{_.*}} = Add(
11 // CHECK: {{_.*}} = Sub(
12 // CHECK: {{_.*}} = Mul(
fc512014
XL
13 let _x = core::intrinsics::wrapping_add(a, b);
14 let _y = core::intrinsics::wrapping_sub(a, b);
15 let _z = core::intrinsics::wrapping_mul(a, b);
16}
17
fe692bf9
FG
18// EMIT_MIR lower_intrinsics.unchecked.LowerIntrinsics.diff
19pub unsafe fn unchecked(a: i32, b: i32) {
ed00b5ec
FG
20 // CHECK-LABEL: fn unchecked(
21 // CHECK: {{_.*}} = AddUnchecked(
22 // CHECK: {{_.*}} = SubUnchecked(
23 // CHECK: {{_.*}} = MulUnchecked(
24 // CHECK: {{_.*}} = Div(
25 // CHECK: {{_.*}} = Rem(
26 // CHECK: {{_.*}} = ShlUnchecked(
27 // CHECK: {{_.*}} = ShrUnchecked(
fe692bf9
FG
28 let _a = core::intrinsics::unchecked_add(a, b);
29 let _b = core::intrinsics::unchecked_sub(a, b);
30 let _c = core::intrinsics::unchecked_mul(a, b);
31 let _x = core::intrinsics::unchecked_div(a, b);
32 let _y = core::intrinsics::unchecked_rem(a, b);
33 let _i = core::intrinsics::unchecked_shl(a, b);
34 let _j = core::intrinsics::unchecked_shr(a, b);
35}
36
fc512014
XL
37// EMIT_MIR lower_intrinsics.size_of.LowerIntrinsics.diff
38pub fn size_of<T>() -> usize {
ed00b5ec
FG
39 // CHECK-LABEL: fn size_of(
40 // CHECK: {{_.*}} = SizeOf(T);
fc512014
XL
41 core::intrinsics::size_of::<T>()
42}
43
c295e0f8
XL
44// EMIT_MIR lower_intrinsics.align_of.LowerIntrinsics.diff
45pub fn align_of<T>() -> usize {
ed00b5ec
FG
46 // CHECK-LABEL: fn align_of(
47 // CHECK: {{_.*}} = AlignOf(T);
c295e0f8
XL
48 core::intrinsics::min_align_of::<T>()
49}
50
fc512014
XL
51// EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
52pub fn forget<T>(t: T) {
ed00b5ec
FG
53 // CHECK-LABEL: fn forget(
54 // CHECK-NOT: Drop(
55 // CHECK: return;
56 // CHECK-NOT: Drop(
5869c6ff 57 core::intrinsics::forget(t)
fc512014
XL
58}
59
60// EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
61pub fn unreachable() -> ! {
ed00b5ec
FG
62 // CHECK-LABEL: fn unreachable(
63 // CHECK: unreachable;
fc512014
XL
64 unsafe { core::intrinsics::unreachable() };
65}
66
fc512014
XL
67// EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
68pub fn non_const<T>() -> usize {
ed00b5ec
FG
69 // CHECK-LABEL: fn non_const(
70 // CHECK: SizeOf(T);
71
fc512014
XL
72 // Check that lowering works with non-const operand as a func.
73 let size_of_t = core::intrinsics::size_of::<T>;
74 size_of_t()
75}
76
353b0b11
FG
77// EMIT_MIR lower_intrinsics.transmute_inhabited.LowerIntrinsics.diff
78pub fn transmute_inhabited(c: std::cmp::Ordering) -> i8 {
ed00b5ec
FG
79 // CHECK-LABEL: fn transmute_inhabited(
80 // CHECK: {{_.*}} = {{.*}} as i8 (Transmute);
81
353b0b11
FG
82 unsafe { std::mem::transmute(c) }
83}
84
85// EMIT_MIR lower_intrinsics.transmute_uninhabited.LowerIntrinsics.diff
86pub unsafe fn transmute_uninhabited(u: ()) -> Never {
ed00b5ec
FG
87 // CHECK-LABEL: fn transmute_uninhabited(
88 // CHECK: {{_.*}} = {{.*}} as Never (Transmute);
89 // CHECK: unreachable;
90
353b0b11
FG
91 unsafe { std::mem::transmute::<(), Never>(u) }
92}
93
94// EMIT_MIR lower_intrinsics.transmute_ref_dst.LowerIntrinsics.diff
95pub unsafe fn transmute_ref_dst<T: ?Sized>(u: &T) -> *const T {
ed00b5ec
FG
96 // CHECK-LABEL: fn transmute_ref_dst(
97 // CHECK: {{_.*}} = {{.*}} as *const T (Transmute);
98
353b0b11
FG
99 unsafe { std::mem::transmute(u) }
100}
101
102// EMIT_MIR lower_intrinsics.transmute_to_ref_uninhabited.LowerIntrinsics.diff
103pub unsafe fn transmute_to_ref_uninhabited() -> ! {
ed00b5ec
FG
104 // CHECK-LABEL: fn transmute_to_ref_uninhabited(
105 // CHECK: {{_.*}} = {{.*}} as &Never (Transmute);
106 // CHECK: unreachable;
107
353b0b11
FG
108 let x: &Never = std::mem::transmute(1usize);
109 match *x {}
110}
111
112// EMIT_MIR lower_intrinsics.transmute_to_mut_uninhabited.LowerIntrinsics.diff
113pub unsafe fn transmute_to_mut_uninhabited() -> ! {
ed00b5ec
FG
114 // CHECK-LABEL: fn transmute_to_mut_uninhabited(
115 // CHECK: {{_.*}} = {{.*}} as &mut Never (Transmute);
116 // CHECK: unreachable;
117
353b0b11
FG
118 let x: &mut Never = std::mem::transmute(1usize);
119 match *x {}
120}
121
122// EMIT_MIR lower_intrinsics.transmute_to_box_uninhabited.LowerIntrinsics.diff
123pub unsafe fn transmute_to_box_uninhabited() -> ! {
ed00b5ec
FG
124 // CHECK-LABEL: fn transmute_to_box_uninhabited(
125 // CHECK: {{_.*}} = {{.*}} as std::boxed::Box<Never> (Transmute);
126 // CHECK: unreachable;
127
353b0b11
FG
128 let x: Box<Never> = std::mem::transmute(1usize);
129 match *x {}
130}
131
fc512014
XL
132pub enum E {
133 A,
134 B,
135 C,
136}
137
138// EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff
139pub fn discriminant<T>(t: T) {
ed00b5ec
FG
140 // CHECK-LABEL: fn discriminant(
141 // CHECK: {{_.*}} = discriminant(
142 // CHECK: {{_.*}} = discriminant(
143 // CHECK: {{_.*}} = discriminant(
144 // CHECK: {{_.*}} = discriminant(
145
fc512014
XL
146 core::intrinsics::discriminant_value(&t);
147 core::intrinsics::discriminant_value(&0);
148 core::intrinsics::discriminant_value(&());
149 core::intrinsics::discriminant_value(&E::B);
150}
f2b60f7d
FG
151
152extern "rust-intrinsic" {
153 // Cannot use `std::intrinsics::copy_nonoverlapping` as that is a wrapper function
353b0b11 154 #[rustc_nounwind]
f2b60f7d
FG
155 fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
156}
157
158// EMIT_MIR lower_intrinsics.f_copy_nonoverlapping.LowerIntrinsics.diff
159pub fn f_copy_nonoverlapping() {
ed00b5ec
FG
160 // CHECK-LABEL: fn f_copy_nonoverlapping(
161 // CHECK: copy_nonoverlapping({{.*}});
162
f2b60f7d
FG
163 let src = ();
164 let mut dst = ();
165 unsafe {
166 copy_nonoverlapping(&src as *const _ as *const i32, &mut dst as *mut _ as *mut i32, 0);
167 }
168}
169
170// EMIT_MIR lower_intrinsics.assume.LowerIntrinsics.diff
171pub fn assume() {
ed00b5ec
FG
172 // CHECK-LABEL: fn assume(
173 // CHECK: assume({{.*}});
174
f2b60f7d
FG
175 unsafe {
176 std::intrinsics::assume(true);
177 }
178}
9ffffee4
FG
179
180// EMIT_MIR lower_intrinsics.with_overflow.LowerIntrinsics.diff
181pub fn with_overflow(a: i32, b: i32) {
ed00b5ec
FG
182 // CHECK-LABEL: fn with_overflow(
183 // CHECK: CheckedAdd(
184 // CHECK: CheckedSub(
185 // CHECK: CheckedMul(
186
9ffffee4
FG
187 let _x = core::intrinsics::add_with_overflow(a, b);
188 let _y = core::intrinsics::sub_with_overflow(a, b);
189 let _z = core::intrinsics::mul_with_overflow(a, b);
190}
353b0b11
FG
191
192// EMIT_MIR lower_intrinsics.read_via_copy_primitive.LowerIntrinsics.diff
193pub fn read_via_copy_primitive(r: &i32) -> i32 {
ed00b5ec
FG
194 // CHECK-LABEL: fn read_via_copy_primitive(
195 // CHECK: [[tmp:_.*]] = &raw const (*_1);
196 // CHECK: _0 = (*[[tmp]]);
197 // CHECK: return;
198
353b0b11
FG
199 unsafe { core::intrinsics::read_via_copy(r) }
200}
201
202// EMIT_MIR lower_intrinsics.read_via_copy_uninhabited.LowerIntrinsics.diff
203pub fn read_via_copy_uninhabited(r: &Never) -> Never {
ed00b5ec
FG
204 // CHECK-LABEL: fn read_via_copy_uninhabited(
205 // CHECK: [[tmp:_.*]] = &raw const (*_1);
206 // CHECK: _0 = (*[[tmp]]);
207 // CHECK: unreachable;
208
353b0b11
FG
209 unsafe { core::intrinsics::read_via_copy(r) }
210}
211
49aad941
FG
212// EMIT_MIR lower_intrinsics.write_via_move_string.LowerIntrinsics.diff
213pub fn write_via_move_string(r: &mut String, v: String) {
ed00b5ec
FG
214 // CHECK-LABEL: fn write_via_move_string(
215 // CHECK: [[ptr:_.*]] = &raw mut (*_1);
216 // CHECK: [[tmp:_.*]] = move _2;
217 // CHECK: (*[[ptr]]) = move [[tmp]];
218 // CHECK: return;
219
49aad941
FG
220 unsafe { core::intrinsics::write_via_move(r, v) }
221}
222
353b0b11
FG
223pub enum Never {}
224
49aad941
FG
225// EMIT_MIR lower_intrinsics.ptr_offset.LowerIntrinsics.diff
226pub unsafe fn ptr_offset(p: *const i32, d: isize) -> *const i32 {
ed00b5ec
FG
227 // CHECK-LABEL: fn ptr_offset(
228 // CHECK: _0 = Offset(
229
49aad941
FG
230 core::intrinsics::offset(p, d)
231}