55
66use std:: intrinsics;
77
8+ #[ repr( align( 32 ) ) ]
9+ pub struct CustomZst ;
10+
11+ type UninitFatPointer = std:: mem:: MaybeUninit < & ' static dyn std:: fmt:: Debug > ;
12+
813// CHECK-LABEL: @volatile_copy_memory
914#[ no_mangle]
1015pub unsafe fn volatile_copy_memory ( a : * mut u8 , b : * const u8 ) {
@@ -28,8 +33,62 @@ pub unsafe fn volatile_set_memory(a: *mut u8, b: u8) {
2833
2934// CHECK-LABEL: @volatile_load
3035#[ no_mangle]
31- pub unsafe fn volatile_load ( a : * const u8 ) -> u8 {
32- // CHECK: load volatile
36+ pub unsafe fn volatile_load ( a : * const u16 ) -> u16 {
37+ // CHECK: [[TEMP:%.+]] = load volatile i16, ptr %a
38+ // CHECK-SAME: align 2{{,|$}}
39+ // CHECK-NEXT: ret i16 [[TEMP]]
40+ intrinsics:: volatile_load ( a)
41+ }
42+
43+ // CHECK-LABEL: @volatile_load_bool
44+ #[ no_mangle]
45+ pub unsafe fn volatile_load_bool ( a : * const bool ) -> bool {
46+ // CHECK: [[TEMP:%.+]] = load volatile i8, ptr %a
47+ // CHECK-SAME: align 1{{,|$}}
48+ // CHECK: [[TRUNC:%.+]] = trunc nuw i8 [[TEMP]] to i1
49+ // CHECK: ret i1 [[TRUNC]]
50+ intrinsics:: volatile_load ( a)
51+ }
52+
53+ // CHECK-LABEL: @volatile_load_zst
54+ #[ no_mangle]
55+ pub unsafe fn volatile_load_zst ( a : * const CustomZst ) -> CustomZst {
56+ // CHECK: start:
57+ // CHECK-NEXT: ret void
58+ intrinsics:: volatile_load ( a)
59+ }
60+
61+ // CHECK-LABEL: @volatile_load_array
62+ // CHECK-SAME: ptr{{.+}}sret([16 x i8]){{.+}}%_0
63+ #[ no_mangle]
64+ pub unsafe fn volatile_load_array ( a : * const [ u16 ; 8 ] ) -> [ u16 ; 8 ] {
65+ // CHECK-NOT: alloca
66+ // CHECK: [[TEMP:%.+]] = load volatile i128, ptr %a,
67+ // CHECK-SAME: align 2{{,|$}}
68+ // CHECK: store i128 [[TEMP]], ptr %_0,
69+ // CHECK-SAME: align 2{{,|$}}
70+ // CHECK-NEXT: ret void
71+ intrinsics:: volatile_load ( a)
72+ }
73+
74+ // CHECK-LABEL: @volatile_load_fat
75+ #[ no_mangle]
76+ pub unsafe fn volatile_load_fat ( a : * const UninitFatPointer ) -> UninitFatPointer {
77+ // CHECK: [[ALLOCA:%.+]] = alloca
78+ // CHECK-SAME: [[SIZE:4|8|16]] x i8
79+ // CHECK-SAME: align [[ALIGN:2|4|8]]
80+
81+ // CHECK: [[TEMP:%.+]] = load volatile [[INT:i32|i64|i128]], ptr %a,
82+ // CHECK-SAME: align [[ALIGN]]{{,|$}}
83+ // CHECK: store [[INT]] [[TEMP]], ptr [[ALLOCA]],
84+ // CHECK-SAME: align [[ALIGN]]{{,|$}}
85+
86+ // CHECK: [[T0:%.+]] = load ptr, ptr [[ALLOCA]], align [[ALIGN]]
87+ // CHECK: [[T1:%.+]] = getelementptr inbounds i8, ptr [[ALLOCA]]
88+ // CHECK: [[T2:%.+]] = load ptr, ptr [[T1]], align [[ALIGN]]
89+ // CHECK: [[P1:%.+]] = insertvalue { ptr, ptr } poison, ptr [[T0]], 0
90+ // CHECK: [[P2:%.+]] = insertvalue { ptr, ptr } [[P1]], ptr [[T2]], 1
91+ // CHECK: ret { ptr, ptr } [[P2]]
3392 intrinsics:: volatile_load ( a)
3493}
3594
@@ -42,8 +101,62 @@ pub unsafe fn volatile_store(a: *mut u8, b: u8) {
42101
43102// CHECK-LABEL: @unaligned_volatile_load
44103#[ no_mangle]
45- pub unsafe fn unaligned_volatile_load ( a : * const u8 ) -> u8 {
46- // CHECK: load volatile
104+ pub unsafe fn unaligned_volatile_load ( a : * const u16 ) -> u16 {
105+ // CHECK: [[TEMP:%.+]] = load volatile i16, ptr %a
106+ // CHECK-SAME: align 1{{,|$}}
107+ // CHECK-NEXT: ret i16 [[TEMP]]
108+ intrinsics:: unaligned_volatile_load ( a)
109+ }
110+
111+ // CHECK-LABEL: @unaligned_volatile_load_bool
112+ #[ no_mangle]
113+ pub unsafe fn unaligned_volatile_load_bool ( a : * const bool ) -> bool {
114+ // CHECK: [[TEMP:%.+]] = load volatile i8, ptr %a
115+ // CHECK-SAME: align 1{{,|$}}
116+ // CHECK: [[TRUNC:%.+]] = trunc nuw i8 [[TEMP]] to i1
117+ // CHECK: ret i1 [[TRUNC]]
118+ intrinsics:: unaligned_volatile_load ( a)
119+ }
120+
121+ // CHECK-LABEL: @unaligned_volatile_load_zst
122+ #[ no_mangle]
123+ pub unsafe fn unaligned_volatile_load_zst ( a : * const CustomZst ) -> CustomZst {
124+ // CHECK: start:
125+ // CHECK-NEXT: ret void
126+ intrinsics:: unaligned_volatile_load ( a)
127+ }
128+
129+ // CHECK-LABEL: @unaligned_volatile_load_array
130+ // CHECK-SAME: ptr{{.+}}sret([16 x i8]){{.+}}%_0,
131+ #[ no_mangle]
132+ pub unsafe fn unaligned_volatile_load_array ( a : * const [ u16 ; 8 ] ) -> [ u16 ; 8 ] {
133+ // CHECK-NOT: alloca
134+ // CHECK: [[TEMP:%.+]] = load volatile i128, ptr %a,
135+ // CHECK-SAME: align 1{{,|$}}
136+ // CHECK: store i128 [[TEMP]], ptr %_0,
137+ // CHECK-SAME: align 2{{,|$}}
138+ // CHECK-NEXT: ret void
139+ intrinsics:: unaligned_volatile_load ( a)
140+ }
141+
142+ // CHECK-LABEL: @unaligned_volatile_load_fat
143+ #[ no_mangle]
144+ pub unsafe fn unaligned_volatile_load_fat ( a : * const UninitFatPointer ) -> UninitFatPointer {
145+ // CHECK: [[ALLOCA:%.+]] = alloca
146+ // CHECK-SAME: [[SIZE]] x i8
147+ // CHECK-SAME: align [[ALIGN]]
148+
149+ // CHECK: [[TEMP:%.+]] = load volatile [[INT]], ptr %a,
150+ // CHECK-SAME: align 1{{,|$}}
151+ // CHECK: store [[INT]] [[TEMP]], ptr [[ALLOCA]],
152+ // CHECK-SAME: align [[ALIGN]]{{,|$}}
153+
154+ // CHECK: [[T0:%.+]] = load ptr, ptr [[ALLOCA]], align [[ALIGN]]
155+ // CHECK: [[T1:%.+]] = getelementptr inbounds i8, ptr [[ALLOCA]]
156+ // CHECK: [[T2:%.+]] = load ptr, ptr [[T1]], align [[ALIGN]]
157+ // CHECK: [[P1:%.+]] = insertvalue { ptr, ptr } poison, ptr [[T0]], 0
158+ // CHECK: [[P2:%.+]] = insertvalue { ptr, ptr } [[P1]], ptr [[T2]], 1
159+ // CHECK: ret { ptr, ptr } [[P2]]
47160 intrinsics:: unaligned_volatile_load ( a)
48161}
49162
0 commit comments