1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
2
; RUN: llc -mtriple riscv32 -mattr=+experimental-zicfilp < %s | FileCheck %s --check-prefixes=CHECK,RV32
3
3
; RUN: llc -mtriple riscv64 -mattr=+experimental-zicfilp < %s | FileCheck %s --check-prefixes=CHECK,RV64
4
+ ; RUN: llc -mtriple riscv32 -mattr=+experimental-zicfilp \
5
+ ; RUN: -riscv-landing-pad-label=1 < %s | FileCheck %s --check-prefixes=FIXED-ONE,FIXED-ONE-RV32
6
+ ; RUN: llc -mtriple riscv64 -mattr=+experimental-zicfilp \
7
+ ; RUN: -riscv-landing-pad-label=1 < %s | FileCheck %s --check-prefixes=FIXED-ONE,FIXED-ONE-RV64
4
8
5
9
; Check indirectbr.
6
10
@__const.indirctbr.addr = private unnamed_addr constant [2 x ptr ] [ptr blockaddress (@indirctbr , %labelA ), ptr blockaddress (@indirctbr , %labelB )], align 8
@@ -15,13 +19,13 @@ define void @indirctbr(i32 %i, ptr %p) {
15
19
; RV32-NEXT: lw a0, 0(a0)
16
20
; RV32-NEXT: jr a0
17
21
; RV32-NEXT: .p2align 2
18
- ; RV32-NEXT: .Ltmp0 : # Block address taken
22
+ ; RV32-NEXT: .Ltmp3 : # Block address taken
19
23
; RV32-NEXT: .LBB0_1: # %labelA
20
24
; RV32-NEXT: lpad 0
21
25
; RV32-NEXT: li a0, 1
22
26
; RV32-NEXT: sw a0, 0(a1)
23
27
; RV32-NEXT: .p2align 2
24
- ; RV32-NEXT: .Ltmp1 : # Block address taken
28
+ ; RV32-NEXT: .Ltmp4 : # Block address taken
25
29
; RV32-NEXT: .LBB0_2: # %labelB
26
30
; RV32-NEXT: lpad 0
27
31
; RV32-NEXT: li a0, 2
@@ -39,18 +43,67 @@ define void @indirctbr(i32 %i, ptr %p) {
39
43
; RV64-NEXT: ld a0, 0(a0)
40
44
; RV64-NEXT: jr a0
41
45
; RV64-NEXT: .p2align 2
42
- ; RV64-NEXT: .Ltmp0 : # Block address taken
46
+ ; RV64-NEXT: .Ltmp3 : # Block address taken
43
47
; RV64-NEXT: .LBB0_1: # %labelA
44
48
; RV64-NEXT: lpad 0
45
49
; RV64-NEXT: li a0, 1
46
50
; RV64-NEXT: sw a0, 0(a1)
47
51
; RV64-NEXT: .p2align 2
48
- ; RV64-NEXT: .Ltmp1 : # Block address taken
52
+ ; RV64-NEXT: .Ltmp4 : # Block address taken
49
53
; RV64-NEXT: .LBB0_2: # %labelB
50
54
; RV64-NEXT: lpad 0
51
55
; RV64-NEXT: li a0, 2
52
56
; RV64-NEXT: sw a0, 0(a1)
53
57
; RV64-NEXT: ret
58
+ ;
59
+ ; FIXED-ONE-RV32-LABEL: indirctbr:
60
+ ; FIXED-ONE-RV32: # %bb.0: # %entry
61
+ ; FIXED-ONE-RV32-NEXT: lpad 1
62
+ ; FIXED-ONE-RV32-NEXT: slli a0, a0, 2
63
+ ; FIXED-ONE-RV32-NEXT: lui a2, %hi(.L__const.indirctbr.addr)
64
+ ; FIXED-ONE-RV32-NEXT: addi a2, a2, %lo(.L__const.indirctbr.addr)
65
+ ; FIXED-ONE-RV32-NEXT: add a0, a2, a0
66
+ ; FIXED-ONE-RV32-NEXT: lw a0, 0(a0)
67
+ ; FIXED-ONE-RV32-NEXT: lui t2, 1
68
+ ; FIXED-ONE-RV32-NEXT: jr a0
69
+ ; FIXED-ONE-RV32-NEXT: .p2align 2
70
+ ; FIXED-ONE-RV32-NEXT: .Ltmp3: # Block address taken
71
+ ; FIXED-ONE-RV32-NEXT: .LBB0_1: # %labelA
72
+ ; FIXED-ONE-RV32-NEXT: lpad 1
73
+ ; FIXED-ONE-RV32-NEXT: li a0, 1
74
+ ; FIXED-ONE-RV32-NEXT: sw a0, 0(a1)
75
+ ; FIXED-ONE-RV32-NEXT: .p2align 2
76
+ ; FIXED-ONE-RV32-NEXT: .Ltmp4: # Block address taken
77
+ ; FIXED-ONE-RV32-NEXT: .LBB0_2: # %labelB
78
+ ; FIXED-ONE-RV32-NEXT: lpad 1
79
+ ; FIXED-ONE-RV32-NEXT: li a0, 2
80
+ ; FIXED-ONE-RV32-NEXT: sw a0, 0(a1)
81
+ ; FIXED-ONE-RV32-NEXT: ret
82
+ ;
83
+ ; FIXED-ONE-RV64-LABEL: indirctbr:
84
+ ; FIXED-ONE-RV64: # %bb.0: # %entry
85
+ ; FIXED-ONE-RV64-NEXT: lpad 1
86
+ ; FIXED-ONE-RV64-NEXT: sext.w a0, a0
87
+ ; FIXED-ONE-RV64-NEXT: slli a0, a0, 3
88
+ ; FIXED-ONE-RV64-NEXT: lui a2, %hi(.L__const.indirctbr.addr)
89
+ ; FIXED-ONE-RV64-NEXT: addi a2, a2, %lo(.L__const.indirctbr.addr)
90
+ ; FIXED-ONE-RV64-NEXT: add a0, a2, a0
91
+ ; FIXED-ONE-RV64-NEXT: ld a0, 0(a0)
92
+ ; FIXED-ONE-RV64-NEXT: lui t2, 1
93
+ ; FIXED-ONE-RV64-NEXT: jr a0
94
+ ; FIXED-ONE-RV64-NEXT: .p2align 2
95
+ ; FIXED-ONE-RV64-NEXT: .Ltmp3: # Block address taken
96
+ ; FIXED-ONE-RV64-NEXT: .LBB0_1: # %labelA
97
+ ; FIXED-ONE-RV64-NEXT: lpad 1
98
+ ; FIXED-ONE-RV64-NEXT: li a0, 1
99
+ ; FIXED-ONE-RV64-NEXT: sw a0, 0(a1)
100
+ ; FIXED-ONE-RV64-NEXT: .p2align 2
101
+ ; FIXED-ONE-RV64-NEXT: .Ltmp4: # Block address taken
102
+ ; FIXED-ONE-RV64-NEXT: .LBB0_2: # %labelB
103
+ ; FIXED-ONE-RV64-NEXT: lpad 1
104
+ ; FIXED-ONE-RV64-NEXT: li a0, 2
105
+ ; FIXED-ONE-RV64-NEXT: sw a0, 0(a1)
106
+ ; FIXED-ONE-RV64-NEXT: ret
54
107
entry:
55
108
%arrayidx = getelementptr inbounds [2 x ptr ], ptr @__const.indirctbr.addr , i64 0 , i32 %i
56
109
%0 = load ptr , ptr %arrayidx
@@ -65,12 +118,120 @@ labelB: ; preds = %labelA, %entry
65
118
ret void
66
119
}
67
120
121
+ ; Check indirect call.
122
+ define void @call (ptr %0 ) {
123
+ ; CHECK-LABEL: call:
124
+ ; CHECK: # %bb.0:
125
+ ; CHECK-NEXT: lpad 0
126
+ ; CHECK-NEXT: jr a0
127
+ ;
128
+ ; FIXED-ONE-LABEL: call:
129
+ ; FIXED-ONE: # %bb.0:
130
+ ; FIXED-ONE-NEXT: lpad 1
131
+ ; FIXED-ONE-NEXT: lui t2, 1
132
+ ; FIXED-ONE-NEXT: jr a0
133
+ tail call void %0 ()
134
+ ret void
135
+ }
136
+
137
+ ; Check invoke.
138
+ declare dso_local i32 @__gxx_personality_v0 (...)
139
+ define void @invoke (ptr %f ) personality ptr @__gxx_personality_v0 {
140
+ ; RV32-LABEL: invoke:
141
+ ; RV32: # %bb.0: # %entry
142
+ ; RV32-NEXT: lpad 0
143
+ ; RV32-NEXT: addi sp, sp, -16
144
+ ; RV32-NEXT: .cfi_def_cfa_offset 16
145
+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
146
+ ; RV32-NEXT: .cfi_offset ra, -4
147
+ ; RV32-NEXT: .Ltmp0:
148
+ ; RV32-NEXT: jalr a0
149
+ ; RV32-NEXT: .Ltmp1:
150
+ ; RV32-NEXT: .LBB2_1: # %try.cont
151
+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
152
+ ; RV32-NEXT: addi sp, sp, 16
153
+ ; RV32-NEXT: ret
154
+ ; RV32-NEXT: .LBB2_2: # %lpad
155
+ ; RV32-NEXT: .Ltmp2:
156
+ ; RV32-NEXT: j .LBB2_1
157
+ ;
158
+ ; RV64-LABEL: invoke:
159
+ ; RV64: # %bb.0: # %entry
160
+ ; RV64-NEXT: lpad 0
161
+ ; RV64-NEXT: addi sp, sp, -16
162
+ ; RV64-NEXT: .cfi_def_cfa_offset 16
163
+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
164
+ ; RV64-NEXT: .cfi_offset ra, -8
165
+ ; RV64-NEXT: .Ltmp0:
166
+ ; RV64-NEXT: jalr a0
167
+ ; RV64-NEXT: .Ltmp1:
168
+ ; RV64-NEXT: .LBB2_1: # %try.cont
169
+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
170
+ ; RV64-NEXT: addi sp, sp, 16
171
+ ; RV64-NEXT: ret
172
+ ; RV64-NEXT: .LBB2_2: # %lpad
173
+ ; RV64-NEXT: .Ltmp2:
174
+ ; RV64-NEXT: j .LBB2_1
175
+ ;
176
+ ; FIXED-ONE-RV32-LABEL: invoke:
177
+ ; FIXED-ONE-RV32: # %bb.0: # %entry
178
+ ; FIXED-ONE-RV32-NEXT: lpad 1
179
+ ; FIXED-ONE-RV32-NEXT: addi sp, sp, -16
180
+ ; FIXED-ONE-RV32-NEXT: .cfi_def_cfa_offset 16
181
+ ; FIXED-ONE-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
182
+ ; FIXED-ONE-RV32-NEXT: .cfi_offset ra, -4
183
+ ; FIXED-ONE-RV32-NEXT: .Ltmp0:
184
+ ; FIXED-ONE-RV32-NEXT: lui t2, 1
185
+ ; FIXED-ONE-RV32-NEXT: jalr a0
186
+ ; FIXED-ONE-RV32-NEXT: .Ltmp1:
187
+ ; FIXED-ONE-RV32-NEXT: .LBB2_1: # %try.cont
188
+ ; FIXED-ONE-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
189
+ ; FIXED-ONE-RV32-NEXT: addi sp, sp, 16
190
+ ; FIXED-ONE-RV32-NEXT: ret
191
+ ; FIXED-ONE-RV32-NEXT: .LBB2_2: # %lpad
192
+ ; FIXED-ONE-RV32-NEXT: .Ltmp2:
193
+ ; FIXED-ONE-RV32-NEXT: j .LBB2_1
194
+ ;
195
+ ; FIXED-ONE-RV64-LABEL: invoke:
196
+ ; FIXED-ONE-RV64: # %bb.0: # %entry
197
+ ; FIXED-ONE-RV64-NEXT: lpad 1
198
+ ; FIXED-ONE-RV64-NEXT: addi sp, sp, -16
199
+ ; FIXED-ONE-RV64-NEXT: .cfi_def_cfa_offset 16
200
+ ; FIXED-ONE-RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
201
+ ; FIXED-ONE-RV64-NEXT: .cfi_offset ra, -8
202
+ ; FIXED-ONE-RV64-NEXT: .Ltmp0:
203
+ ; FIXED-ONE-RV64-NEXT: lui t2, 1
204
+ ; FIXED-ONE-RV64-NEXT: jalr a0
205
+ ; FIXED-ONE-RV64-NEXT: .Ltmp1:
206
+ ; FIXED-ONE-RV64-NEXT: .LBB2_1: # %try.cont
207
+ ; FIXED-ONE-RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
208
+ ; FIXED-ONE-RV64-NEXT: addi sp, sp, 16
209
+ ; FIXED-ONE-RV64-NEXT: ret
210
+ ; FIXED-ONE-RV64-NEXT: .LBB2_2: # %lpad
211
+ ; FIXED-ONE-RV64-NEXT: .Ltmp2:
212
+ ; FIXED-ONE-RV64-NEXT: j .LBB2_1
213
+ entry:
214
+ invoke void %f () to label %try.cont unwind label %lpad
215
+
216
+ lpad:
217
+ %0 = landingpad { ptr , i32 } cleanup
218
+ br label %try.cont
219
+
220
+ try.cont:
221
+ ret void
222
+ }
223
+
68
224
; Check external linkage function.
69
225
define void @external () {
70
226
; CHECK-LABEL: external:
71
227
; CHECK: # %bb.0:
72
228
; CHECK-NEXT: lpad 0
73
229
; CHECK-NEXT: ret
230
+ ;
231
+ ; FIXED-ONE-LABEL: external:
232
+ ; FIXED-ONE: # %bb.0:
233
+ ; FIXED-ONE-NEXT: lpad 1
234
+ ; FIXED-ONE-NEXT: ret
74
235
ret void
75
236
}
76
237
@@ -79,6 +240,10 @@ define internal void @internal() {
79
240
; CHECK-LABEL: internal:
80
241
; CHECK: # %bb.0:
81
242
; CHECK-NEXT: ret
243
+ ;
244
+ ; FIXED-ONE-LABEL: internal:
245
+ ; FIXED-ONE: # %bb.0:
246
+ ; FIXED-ONE-NEXT: ret
82
247
ret void
83
248
}
84
249
@@ -89,6 +254,11 @@ define internal void @internal2() {
89
254
; CHECK: # %bb.0:
90
255
; CHECK-NEXT: lpad 0
91
256
; CHECK-NEXT: ret
257
+ ;
258
+ ; FIXED-ONE-LABEL: internal2:
259
+ ; FIXED-ONE: # %bb.0:
260
+ ; FIXED-ONE-NEXT: lpad 1
261
+ ; FIXED-ONE-NEXT: ret
92
262
ret void
93
263
}
94
264
@@ -97,5 +267,9 @@ define void @interrupt() "interrupt"="user" {
97
267
; CHECK-LABEL: interrupt:
98
268
; CHECK: # %bb.0:
99
269
; CHECK-NEXT: mret
270
+ ;
271
+ ; FIXED-ONE-LABEL: interrupt:
272
+ ; FIXED-ONE: # %bb.0:
273
+ ; FIXED-ONE-NEXT: mret
100
274
ret void
101
275
}
0 commit comments