3
3
; RUN: | FileCheck %s --check-prefix=RV32
4
4
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5
5
; RUN: | FileCheck %s --check-prefix=RV64
6
+ ; RUN: llc -mtriple=riscv32 -mattr=+experimental-zicfiss -verify-machineinstrs < %s \
7
+ ; RUN: | FileCheck %s --check-prefix=RV32-ZICFISS
8
+ ; RUN: llc -mtriple=riscv64 -mattr=+experimental-zicfiss -verify-machineinstrs < %s \
9
+ ; RUN: | FileCheck %s --check-prefix=RV64-ZICFISS
6
10
7
11
define void @f1 () shadowcallstack {
8
12
; RV32-LABEL: f1:
@@ -12,6 +16,14 @@ define void @f1() shadowcallstack {
12
16
; RV64-LABEL: f1:
13
17
; RV64: # %bb.0:
14
18
; RV64-NEXT: ret
19
+ ;
20
+ ; RV32-ZICFISS-LABEL: f1:
21
+ ; RV32-ZICFISS: # %bb.0:
22
+ ; RV32-ZICFISS-NEXT: ret
23
+ ;
24
+ ; RV64-ZICFISS-LABEL: f1:
25
+ ; RV64-ZICFISS: # %bb.0:
26
+ ; RV64-ZICFISS-NEXT: ret
15
27
ret void
16
28
}
17
29
@@ -25,6 +37,14 @@ define void @f2() shadowcallstack {
25
37
; RV64-LABEL: f2:
26
38
; RV64: # %bb.0:
27
39
; RV64-NEXT: tail foo
40
+ ;
41
+ ; RV32-ZICFISS-LABEL: f2:
42
+ ; RV32-ZICFISS: # %bb.0:
43
+ ; RV32-ZICFISS-NEXT: tail foo
44
+ ;
45
+ ; RV64-ZICFISS-LABEL: f2:
46
+ ; RV64-ZICFISS: # %bb.0:
47
+ ; RV64-ZICFISS-NEXT: tail foo
28
48
tail call void @foo ()
29
49
ret void
30
50
}
@@ -65,6 +85,32 @@ define i32 @f3() shadowcallstack {
65
85
; RV64-NEXT: addi gp, gp, -8
66
86
; RV64-NEXT: .cfi_restore gp
67
87
; RV64-NEXT: ret
88
+ ;
89
+ ; RV32-ZICFISS-LABEL: f3:
90
+ ; RV32-ZICFISS: # %bb.0:
91
+ ; RV32-ZICFISS-NEXT: sspush ra
92
+ ; RV32-ZICFISS-NEXT: addi sp, sp, -16
93
+ ; RV32-ZICFISS-NEXT: .cfi_def_cfa_offset 16
94
+ ; RV32-ZICFISS-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
95
+ ; RV32-ZICFISS-NEXT: .cfi_offset ra, -4
96
+ ; RV32-ZICFISS-NEXT: call bar
97
+ ; RV32-ZICFISS-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
98
+ ; RV32-ZICFISS-NEXT: addi sp, sp, 16
99
+ ; RV32-ZICFISS-NEXT: sspopchk ra
100
+ ; RV32-ZICFISS-NEXT: ret
101
+ ;
102
+ ; RV64-ZICFISS-LABEL: f3:
103
+ ; RV64-ZICFISS: # %bb.0:
104
+ ; RV64-ZICFISS-NEXT: sspush ra
105
+ ; RV64-ZICFISS-NEXT: addi sp, sp, -16
106
+ ; RV64-ZICFISS-NEXT: .cfi_def_cfa_offset 16
107
+ ; RV64-ZICFISS-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
108
+ ; RV64-ZICFISS-NEXT: .cfi_offset ra, -8
109
+ ; RV64-ZICFISS-NEXT: call bar
110
+ ; RV64-ZICFISS-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
111
+ ; RV64-ZICFISS-NEXT: addi sp, sp, 16
112
+ ; RV64-ZICFISS-NEXT: sspopchk ra
113
+ ; RV64-ZICFISS-NEXT: ret
68
114
%res = call i32 @bar ()
69
115
%res1 = add i32 %res , 1
70
116
ret i32 %res
@@ -140,6 +186,68 @@ define i32 @f4() shadowcallstack {
140
186
; RV64-NEXT: addi gp, gp, -8
141
187
; RV64-NEXT: .cfi_restore gp
142
188
; RV64-NEXT: ret
189
+ ;
190
+ ; RV32-ZICFISS-LABEL: f4:
191
+ ; RV32-ZICFISS: # %bb.0:
192
+ ; RV32-ZICFISS-NEXT: sspush ra
193
+ ; RV32-ZICFISS-NEXT: addi sp, sp, -16
194
+ ; RV32-ZICFISS-NEXT: .cfi_def_cfa_offset 16
195
+ ; RV32-ZICFISS-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
196
+ ; RV32-ZICFISS-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
197
+ ; RV32-ZICFISS-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
198
+ ; RV32-ZICFISS-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
199
+ ; RV32-ZICFISS-NEXT: .cfi_offset ra, -4
200
+ ; RV32-ZICFISS-NEXT: .cfi_offset s0, -8
201
+ ; RV32-ZICFISS-NEXT: .cfi_offset s1, -12
202
+ ; RV32-ZICFISS-NEXT: .cfi_offset s2, -16
203
+ ; RV32-ZICFISS-NEXT: call bar
204
+ ; RV32-ZICFISS-NEXT: mv s0, a0
205
+ ; RV32-ZICFISS-NEXT: call bar
206
+ ; RV32-ZICFISS-NEXT: mv s1, a0
207
+ ; RV32-ZICFISS-NEXT: call bar
208
+ ; RV32-ZICFISS-NEXT: mv s2, a0
209
+ ; RV32-ZICFISS-NEXT: call bar
210
+ ; RV32-ZICFISS-NEXT: add s0, s0, s1
211
+ ; RV32-ZICFISS-NEXT: add a0, s2, a0
212
+ ; RV32-ZICFISS-NEXT: add a0, s0, a0
213
+ ; RV32-ZICFISS-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
214
+ ; RV32-ZICFISS-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
215
+ ; RV32-ZICFISS-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
216
+ ; RV32-ZICFISS-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
217
+ ; RV32-ZICFISS-NEXT: addi sp, sp, 16
218
+ ; RV32-ZICFISS-NEXT: sspopchk ra
219
+ ; RV32-ZICFISS-NEXT: ret
220
+ ;
221
+ ; RV64-ZICFISS-LABEL: f4:
222
+ ; RV64-ZICFISS: # %bb.0:
223
+ ; RV64-ZICFISS-NEXT: sspush ra
224
+ ; RV64-ZICFISS-NEXT: addi sp, sp, -32
225
+ ; RV64-ZICFISS-NEXT: .cfi_def_cfa_offset 32
226
+ ; RV64-ZICFISS-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
227
+ ; RV64-ZICFISS-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
228
+ ; RV64-ZICFISS-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
229
+ ; RV64-ZICFISS-NEXT: sd s2, 0(sp) # 8-byte Folded Spill
230
+ ; RV64-ZICFISS-NEXT: .cfi_offset ra, -8
231
+ ; RV64-ZICFISS-NEXT: .cfi_offset s0, -16
232
+ ; RV64-ZICFISS-NEXT: .cfi_offset s1, -24
233
+ ; RV64-ZICFISS-NEXT: .cfi_offset s2, -32
234
+ ; RV64-ZICFISS-NEXT: call bar
235
+ ; RV64-ZICFISS-NEXT: mv s0, a0
236
+ ; RV64-ZICFISS-NEXT: call bar
237
+ ; RV64-ZICFISS-NEXT: mv s1, a0
238
+ ; RV64-ZICFISS-NEXT: call bar
239
+ ; RV64-ZICFISS-NEXT: mv s2, a0
240
+ ; RV64-ZICFISS-NEXT: call bar
241
+ ; RV64-ZICFISS-NEXT: add s0, s0, s1
242
+ ; RV64-ZICFISS-NEXT: add a0, s2, a0
243
+ ; RV64-ZICFISS-NEXT: addw a0, s0, a0
244
+ ; RV64-ZICFISS-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
245
+ ; RV64-ZICFISS-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
246
+ ; RV64-ZICFISS-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
247
+ ; RV64-ZICFISS-NEXT: ld s2, 0(sp) # 8-byte Folded Reload
248
+ ; RV64-ZICFISS-NEXT: addi sp, sp, 32
249
+ ; RV64-ZICFISS-NEXT: sspopchk ra
250
+ ; RV64-ZICFISS-NEXT: ret
143
251
%res1 = call i32 @bar ()
144
252
%res2 = call i32 @bar ()
145
253
%res3 = call i32 @bar ()
@@ -176,6 +284,28 @@ define i32 @f5() shadowcallstack nounwind {
176
284
; RV64-NEXT: ld ra, -8(gp)
177
285
; RV64-NEXT: addi gp, gp, -8
178
286
; RV64-NEXT: ret
287
+ ;
288
+ ; RV32-ZICFISS-LABEL: f5:
289
+ ; RV32-ZICFISS: # %bb.0:
290
+ ; RV32-ZICFISS-NEXT: sspush ra
291
+ ; RV32-ZICFISS-NEXT: addi sp, sp, -16
292
+ ; RV32-ZICFISS-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
293
+ ; RV32-ZICFISS-NEXT: call bar
294
+ ; RV32-ZICFISS-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
295
+ ; RV32-ZICFISS-NEXT: addi sp, sp, 16
296
+ ; RV32-ZICFISS-NEXT: sspopchk ra
297
+ ; RV32-ZICFISS-NEXT: ret
298
+ ;
299
+ ; RV64-ZICFISS-LABEL: f5:
300
+ ; RV64-ZICFISS: # %bb.0:
301
+ ; RV64-ZICFISS-NEXT: sspush ra
302
+ ; RV64-ZICFISS-NEXT: addi sp, sp, -16
303
+ ; RV64-ZICFISS-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
304
+ ; RV64-ZICFISS-NEXT: call bar
305
+ ; RV64-ZICFISS-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
306
+ ; RV64-ZICFISS-NEXT: addi sp, sp, 16
307
+ ; RV64-ZICFISS-NEXT: sspopchk ra
308
+ ; RV64-ZICFISS-NEXT: ret
179
309
%res = call i32 @bar ()
180
310
%res1 = add i32 %res , 1
181
311
ret i32 %res
0 commit comments