blob: a459e1a29791033447a8cbb8961591203af408fa [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=riscv32 -mattr=+v,+zimop,+save-restore %s -o - | FileCheck %s --check-prefixes=RV32V
; RUN: llc -mtriple=riscv64 -mattr=+v,+zimop,+save-restore %s -o - | FileCheck %s --check-prefixes=RV64V
declare void @g()
define <vscale x 4 x i32> @w(<vscale x 4 x i32> %a) shadowcallstack {
; RV32V-LABEL: w:
; RV32V: # %bb.0:
; RV32V-NEXT: addi gp, gp, 4
; RV32V-NEXT: sw ra, -4(gp)
; RV32V-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c #
; RV32V-NEXT: call t0, __riscv_save_0
; RV32V-NEXT: .cfi_def_cfa_offset 16
; RV32V-NEXT: .cfi_offset ra, -4
; RV32V-NEXT: addi sp, sp, -16
; RV32V-NEXT: .cfi_def_cfa_offset 32
; RV32V-NEXT: csrr a0, vlenb
; RV32V-NEXT: slli a0, a0, 1
; RV32V-NEXT: sub sp, sp, a0
; RV32V-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 2 * vlenb
; RV32V-NEXT: addi a0, sp, 16
; RV32V-NEXT: vs2r.v v8, (a0) # vscale x 16-byte Folded Spill
; RV32V-NEXT: call g
; RV32V-NEXT: addi a0, sp, 16
; RV32V-NEXT: vl2r.v v8, (a0) # vscale x 16-byte Folded Reload
; RV32V-NEXT: csrr a0, vlenb
; RV32V-NEXT: slli a0, a0, 1
; RV32V-NEXT: add sp, sp, a0
; RV32V-NEXT: .cfi_def_cfa sp, 32
; RV32V-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32V-NEXT: .cfi_restore ra
; RV32V-NEXT: addi sp, sp, 32
; RV32V-NEXT: .cfi_def_cfa_offset 0
; RV32V-NEXT: lw ra, -4(gp)
; RV32V-NEXT: addi gp, gp, -4
; RV32V-NEXT: .cfi_restore gp
; RV32V-NEXT: ret
;
; RV64V-LABEL: w:
; RV64V: # %bb.0:
; RV64V-NEXT: addi gp, gp, 8
; RV64V-NEXT: sd ra, -8(gp)
; RV64V-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 #
; RV64V-NEXT: call t0, __riscv_save_0
; RV64V-NEXT: .cfi_def_cfa_offset 16
; RV64V-NEXT: .cfi_offset ra, -8
; RV64V-NEXT: addi sp, sp, -16
; RV64V-NEXT: .cfi_def_cfa_offset 32
; RV64V-NEXT: csrr a0, vlenb
; RV64V-NEXT: slli a0, a0, 1
; RV64V-NEXT: sub sp, sp, a0
; RV64V-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 2 * vlenb
; RV64V-NEXT: addi a0, sp, 16
; RV64V-NEXT: vs2r.v v8, (a0) # vscale x 16-byte Folded Spill
; RV64V-NEXT: call g
; RV64V-NEXT: addi a0, sp, 16
; RV64V-NEXT: vl2r.v v8, (a0) # vscale x 16-byte Folded Reload
; RV64V-NEXT: csrr a0, vlenb
; RV64V-NEXT: slli a0, a0, 1
; RV64V-NEXT: add sp, sp, a0
; RV64V-NEXT: .cfi_def_cfa sp, 32
; RV64V-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64V-NEXT: .cfi_restore ra
; RV64V-NEXT: addi sp, sp, 32
; RV64V-NEXT: .cfi_def_cfa_offset 0
; RV64V-NEXT: ld ra, -8(gp)
; RV64V-NEXT: addi gp, gp, -8
; RV64V-NEXT: .cfi_restore gp
; RV64V-NEXT: ret
call void @g()
ret <vscale x 4 x i32> %a
}
define <vscale x 4 x i32> @z(<vscale x 4 x i32> %a) "hw-shadow-stack" {
; RV32V-LABEL: z:
; RV32V: # %bb.0:
; RV32V-NEXT: sspush ra
; RV32V-NEXT: call t0, __riscv_save_0
; RV32V-NEXT: .cfi_def_cfa_offset 16
; RV32V-NEXT: .cfi_offset ra, -4
; RV32V-NEXT: addi sp, sp, -16
; RV32V-NEXT: .cfi_def_cfa_offset 32
; RV32V-NEXT: csrr a0, vlenb
; RV32V-NEXT: slli a0, a0, 1
; RV32V-NEXT: sub sp, sp, a0
; RV32V-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 2 * vlenb
; RV32V-NEXT: addi a0, sp, 16
; RV32V-NEXT: vs2r.v v8, (a0) # vscale x 16-byte Folded Spill
; RV32V-NEXT: call g
; RV32V-NEXT: addi a0, sp, 16
; RV32V-NEXT: vl2r.v v8, (a0) # vscale x 16-byte Folded Reload
; RV32V-NEXT: csrr a0, vlenb
; RV32V-NEXT: slli a0, a0, 1
; RV32V-NEXT: add sp, sp, a0
; RV32V-NEXT: .cfi_def_cfa sp, 32
; RV32V-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32V-NEXT: .cfi_restore ra
; RV32V-NEXT: addi sp, sp, 32
; RV32V-NEXT: .cfi_def_cfa_offset 0
; RV32V-NEXT: sspopchk ra
; RV32V-NEXT: ret
;
; RV64V-LABEL: z:
; RV64V: # %bb.0:
; RV64V-NEXT: sspush ra
; RV64V-NEXT: call t0, __riscv_save_0
; RV64V-NEXT: .cfi_def_cfa_offset 16
; RV64V-NEXT: .cfi_offset ra, -8
; RV64V-NEXT: addi sp, sp, -16
; RV64V-NEXT: .cfi_def_cfa_offset 32
; RV64V-NEXT: csrr a0, vlenb
; RV64V-NEXT: slli a0, a0, 1
; RV64V-NEXT: sub sp, sp, a0
; RV64V-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 2 * vlenb
; RV64V-NEXT: addi a0, sp, 16
; RV64V-NEXT: vs2r.v v8, (a0) # vscale x 16-byte Folded Spill
; RV64V-NEXT: call g
; RV64V-NEXT: addi a0, sp, 16
; RV64V-NEXT: vl2r.v v8, (a0) # vscale x 16-byte Folded Reload
; RV64V-NEXT: csrr a0, vlenb
; RV64V-NEXT: slli a0, a0, 1
; RV64V-NEXT: add sp, sp, a0
; RV64V-NEXT: .cfi_def_cfa sp, 32
; RV64V-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64V-NEXT: .cfi_restore ra
; RV64V-NEXT: addi sp, sp, 32
; RV64V-NEXT: .cfi_def_cfa_offset 0
; RV64V-NEXT: sspopchk ra
; RV64V-NEXT: ret
call void @g()
ret <vscale x 4 x i32> %a
}