@@ -289,3 +289,74 @@ define void @interrupt() "interrupt"="machine" {
289289; FIXED-ONE-NEXT: mret
290290 ret void
291291}
292+
293+ declare i32 @setjmp (ptr ) returns_twice
294+
295+ define i32 @test_returns_twice () {
296+ ; RV32-LABEL: test_returns_twice:
297+ ; RV32: # %bb.0:
298+ ; RV32-NEXT: lpad 0
299+ ; RV32-NEXT: addi sp, sp, -16
300+ ; RV32-NEXT: .cfi_def_cfa_offset 16
301+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
302+ ; RV32-NEXT: .cfi_offset ra, -4
303+ ; RV32-NEXT: addi a0, sp, 8
304+ ; RV32-NEXT: call setjmp
305+ ; RV32-NEXT: lpad 0
306+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
307+ ; RV32-NEXT: .cfi_restore ra
308+ ; RV32-NEXT: addi sp, sp, 16
309+ ; RV32-NEXT: .cfi_def_cfa_offset 0
310+ ; RV32-NEXT: ret
311+ ;
312+ ; RV64-LABEL: test_returns_twice:
313+ ; RV64: # %bb.0:
314+ ; RV64-NEXT: lpad 0
315+ ; RV64-NEXT: addi sp, sp, -16
316+ ; RV64-NEXT: .cfi_def_cfa_offset 16
317+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
318+ ; RV64-NEXT: .cfi_offset ra, -8
319+ ; RV64-NEXT: addi a0, sp, 4
320+ ; RV64-NEXT: call setjmp
321+ ; RV64-NEXT: lpad 0
322+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
323+ ; RV64-NEXT: .cfi_restore ra
324+ ; RV64-NEXT: addi sp, sp, 16
325+ ; RV64-NEXT: .cfi_def_cfa_offset 0
326+ ; RV64-NEXT: ret
327+ ;
328+ ; FIXED-ONE-RV32-LABEL: test_returns_twice:
329+ ; FIXED-ONE-RV32: # %bb.0:
330+ ; FIXED-ONE-RV32-NEXT: lpad 1
331+ ; FIXED-ONE-RV32-NEXT: addi sp, sp, -16
332+ ; FIXED-ONE-RV32-NEXT: .cfi_def_cfa_offset 16
333+ ; FIXED-ONE-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
334+ ; FIXED-ONE-RV32-NEXT: .cfi_offset ra, -4
335+ ; FIXED-ONE-RV32-NEXT: addi a0, sp, 8
336+ ; FIXED-ONE-RV32-NEXT: call setjmp
337+ ; FIXED-ONE-RV32-NEXT: lpad 1
338+ ; FIXED-ONE-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
339+ ; FIXED-ONE-RV32-NEXT: .cfi_restore ra
340+ ; FIXED-ONE-RV32-NEXT: addi sp, sp, 16
341+ ; FIXED-ONE-RV32-NEXT: .cfi_def_cfa_offset 0
342+ ; FIXED-ONE-RV32-NEXT: ret
343+ ;
344+ ; FIXED-ONE-RV64-LABEL: test_returns_twice:
345+ ; FIXED-ONE-RV64: # %bb.0:
346+ ; FIXED-ONE-RV64-NEXT: lpad 1
347+ ; FIXED-ONE-RV64-NEXT: addi sp, sp, -16
348+ ; FIXED-ONE-RV64-NEXT: .cfi_def_cfa_offset 16
349+ ; FIXED-ONE-RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
350+ ; FIXED-ONE-RV64-NEXT: .cfi_offset ra, -8
351+ ; FIXED-ONE-RV64-NEXT: addi a0, sp, 4
352+ ; FIXED-ONE-RV64-NEXT: call setjmp
353+ ; FIXED-ONE-RV64-NEXT: lpad 1
354+ ; FIXED-ONE-RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
355+ ; FIXED-ONE-RV64-NEXT: .cfi_restore ra
356+ ; FIXED-ONE-RV64-NEXT: addi sp, sp, 16
357+ ; FIXED-ONE-RV64-NEXT: .cfi_def_cfa_offset 0
358+ ; FIXED-ONE-RV64-NEXT: ret
359+ %buf = alloca [1 x i32 ], align 4
360+ %call = call i32 @setjmp (ptr %buf )
361+ ret i32 %call
362+ }
0 commit comments