| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=riscv32 -mattr=+zimop < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV32 | |
| ; RUN: llc -mtriple=riscv32 -mattr=+zimop,+save-restore < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV32-SAVE-RESTORE | |
| ; RUN: llc -mtriple=riscv32 -mattr=+zimop,+zcmp < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV32-ZCMP | |
| ; RUN: llc -mtriple=riscv32 -mattr=+zimop,+zcmp,+save-restore < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV32-ZCMP-SAVE-RESTORE | |
| ; RUN: llc -mtriple=riscv32 -mattr=+zimop,+xqccmp < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV32-XQCCMP | |
| ; RUN: llc -mtriple=riscv64 -mattr=+zimop < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV64 | |
| ; RUN: llc -mtriple=riscv64 -mattr=+zimop,+save-restore < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV64-SAVE-RESTORE | |
| ; RUN: llc -mtriple=riscv64 -mattr=+zimop,+zcmp < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV64-ZCMP | |
| ; RUN: llc -mtriple=riscv64 -mattr=+zimop,+zcmp,+save-restore < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV64-ZCMP-SAVE-RESTORE | |
| ; RUN: llc -mtriple=riscv64 -mattr=+zimop,+xqccmp < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=RV64-XQCCMP | |
| declare i32 @callee(i32 %x) | |
| ;; Software Shadow Call Stack | |
| define i32 @caller_sw(i32 %x) shadowcallstack { | |
| ; RV32-LABEL: caller_sw: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: addi gp, gp, 4 | |
| ; RV32-NEXT: sw ra, -4(gp) | |
| ; RV32-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: lw ra, -4(gp) | |
| ; RV32-NEXT: addi gp, gp, -4 | |
| ; RV32-NEXT: .cfi_restore gp | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_sw: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_sw: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_sw: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_sw: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-XQCCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV32-XQCCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_sw: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: addi gp, gp, 8 | |
| ; RV64-NEXT: sd ra, -8(gp) | |
| ; RV64-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: ld ra, -8(gp) | |
| ; RV64-NEXT: addi gp, gp, -8 | |
| ; RV64-NEXT: .cfi_restore gp | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_sw: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_sw: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_sw: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_sw: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-XQCCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV64-XQCCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV64-XQCCMP-NEXT: ret | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| ret i32 %add | |
| } | |
| define i32 @caller_sw_tail(i32 %x) shadowcallstack { | |
| ; RV32-LABEL: caller_sw_tail: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: tail callee | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_sw_tail: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_sw_tail: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: tail callee | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_sw_tail: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_sw_tail: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: tail callee | |
| ; | |
| ; RV64-LABEL: caller_sw_tail: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: tail callee | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_sw_tail: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_sw_tail: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: tail callee | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_sw_tail: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_sw_tail: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: tail callee | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| ret i32 %call | |
| } | |
| define i32 @caller_sw_fp(i32 %x) shadowcallstack "frame-pointer"="all" { | |
| ; RV32-LABEL: caller_sw_fp: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: addi gp, gp, 4 | |
| ; RV32-NEXT: sw ra, -4(gp) | |
| ; RV32-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: .cfi_offset s0, -8 | |
| ; RV32-NEXT: addi s0, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: .cfi_restore s0 | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: lw ra, -4(gp) | |
| ; RV32-NEXT: addi gp, gp, -4 | |
| ; RV32-NEXT: .cfi_restore gp | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_sw_fp: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset s0, -8 | |
| ; RV32-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_sw_fp: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-NEXT: addi sp, sp, -16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-ZCMP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-NEXT: .cfi_offset s0, -8 | |
| ; RV32-ZCMP-NEXT: addi s0, sp, 16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-ZCMP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-NEXT: .cfi_restore ra | |
| ; RV32-ZCMP-NEXT: .cfi_restore s0 | |
| ; RV32-ZCMP-NEXT: addi sp, sp, 16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-ZCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_sw_fp: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s0, -8 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_sw_fp: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-XQCCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-XQCCMP-NEXT: qc.cm.pushfp {ra, s0}, -16 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset s0, -8 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra, s0}, 16 | |
| ; RV32-XQCCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_sw_fp: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: addi gp, gp, 8 | |
| ; RV64-NEXT: sd ra, -8(gp) | |
| ; RV64-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: .cfi_offset s0, -16 | |
| ; RV64-NEXT: addi s0, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: .cfi_restore s0 | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: ld ra, -8(gp) | |
| ; RV64-NEXT: addi gp, gp, -8 | |
| ; RV64-NEXT: .cfi_restore gp | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_sw_fp: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset s0, -16 | |
| ; RV64-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_sw_fp: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-NEXT: addi sp, sp, -16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-ZCMP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-NEXT: .cfi_offset s0, -16 | |
| ; RV64-ZCMP-NEXT: addi s0, sp, 16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-ZCMP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-NEXT: .cfi_restore ra | |
| ; RV64-ZCMP-NEXT: .cfi_restore s0 | |
| ; RV64-ZCMP-NEXT: addi sp, sp, 16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-ZCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_sw_fp: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s0, -16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_sw_fp: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-XQCCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-XQCCMP-NEXT: qc.cm.pushfp {ra, s0}, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset s0, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra, s0}, 16 | |
| ; RV64-XQCCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV64-XQCCMP-NEXT: ret | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| ret i32 %add | |
| } | |
| define i32 @caller_sw_cond(i32 %x) shadowcallstack { | |
| ; RV32-LABEL: caller_sw_cond: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: beqz a0, .LBB3_2 | |
| ; RV32-NEXT: # %bb.1: # %if.end | |
| ; RV32-NEXT: addi gp, gp, 4 | |
| ; RV32-NEXT: sw ra, -4(gp) | |
| ; RV32-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: lw ra, -4(gp) | |
| ; RV32-NEXT: addi gp, gp, -4 | |
| ; RV32-NEXT: .cfi_restore gp | |
| ; RV32-NEXT: ret | |
| ; RV32-NEXT: .LBB3_2: # %return | |
| ; RV32-NEXT: li a0, 1 | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_sw_cond: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: beqz a0, .LBB3_2 | |
| ; RV32-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; RV32-SAVE-RESTORE-NEXT: .LBB3_2: # %return | |
| ; RV32-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_sw_cond: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: beqz a0, .LBB3_2 | |
| ; RV32-ZCMP-NEXT: # %bb.1: # %if.end | |
| ; RV32-ZCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-NEXT: ret | |
| ; RV32-ZCMP-NEXT: .LBB3_2: # %return | |
| ; RV32-ZCMP-NEXT: li a0, 1 | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_sw_cond: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: beqz a0, .LBB3_2 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .LBB3_2: # %return | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_sw_cond: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: beqz a0, .LBB3_2 | |
| ; RV32-XQCCMP-NEXT: # %bb.1: # %if.end | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-XQCCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV32-XQCCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; RV32-XQCCMP-NEXT: .LBB3_2: # %return | |
| ; RV32-XQCCMP-NEXT: li a0, 1 | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_sw_cond: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: sext.w a1, a0 | |
| ; RV64-NEXT: beqz a1, .LBB3_2 | |
| ; RV64-NEXT: # %bb.1: # %if.end | |
| ; RV64-NEXT: addi gp, gp, 8 | |
| ; RV64-NEXT: sd ra, -8(gp) | |
| ; RV64-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: ld ra, -8(gp) | |
| ; RV64-NEXT: addi gp, gp, -8 | |
| ; RV64-NEXT: .cfi_restore gp | |
| ; RV64-NEXT: ret | |
| ; RV64-NEXT: .LBB3_2: # %return | |
| ; RV64-NEXT: li a0, 1 | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_sw_cond: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: sext.w a1, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: beqz a1, .LBB3_2 | |
| ; RV64-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; RV64-SAVE-RESTORE-NEXT: .LBB3_2: # %return | |
| ; RV64-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_sw_cond: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: sext.w a1, a0 | |
| ; RV64-ZCMP-NEXT: beqz a1, .LBB3_2 | |
| ; RV64-ZCMP-NEXT: # %bb.1: # %if.end | |
| ; RV64-ZCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-NEXT: ret | |
| ; RV64-ZCMP-NEXT: .LBB3_2: # %return | |
| ; RV64-ZCMP-NEXT: li a0, 1 | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_sw_cond: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sext.w a1, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: beqz a1, .LBB3_2 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .LBB3_2: # %return | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_sw_cond: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: sext.w a1, a0 | |
| ; RV64-XQCCMP-NEXT: beqz a1, .LBB3_2 | |
| ; RV64-XQCCMP-NEXT: # %bb.1: # %if.end | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-XQCCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV64-XQCCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV64-XQCCMP-NEXT: ret | |
| ; RV64-XQCCMP-NEXT: .LBB3_2: # %return | |
| ; RV64-XQCCMP-NEXT: li a0, 1 | |
| ; RV64-XQCCMP-NEXT: ret | |
| %cmp = icmp eq i32 %x, 0 | |
| br i1 %cmp, label %return, label %if.end | |
| if.end: | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| ret i32 %add | |
| return: | |
| ret i32 1 | |
| } | |
| define i32 @caller_sw_clobber_s11(i32 %x) shadowcallstack { | |
| ; RV32-LABEL: caller_sw_clobber_s11: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: addi gp, gp, 4 | |
| ; RV32-NEXT: sw ra, -4(gp) | |
| ; RV32-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: sw s11, 8(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: .cfi_offset s11, -8 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: #APP | |
| ; RV32-NEXT: nop | |
| ; RV32-NEXT: #NO_APP | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: lw s11, 8(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: .cfi_restore s11 | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: lw ra, -4(gp) | |
| ; RV32-NEXT: addi gp, gp, -4 | |
| ; RV32-NEXT: .cfi_restore gp | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_sw_clobber_s11: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_12 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset s11, -52 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: #APP | |
| ; RV32-SAVE-RESTORE-NEXT: nop | |
| ; RV32-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 60(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: lw s11, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore s11 | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 64 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_sw_clobber_s11: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-NEXT: cm.push {ra, s0-s11}, -64 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -52 | |
| ; RV32-ZCMP-NEXT: .cfi_offset s11, -4 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: #APP | |
| ; RV32-ZCMP-NEXT: nop | |
| ; RV32-ZCMP-NEXT: #NO_APP | |
| ; RV32-ZCMP-NEXT: cm.pop {ra, s0-s11}, 64 | |
| ; RV32-ZCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_sw_clobber_s11: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra, s0-s11}, -64 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -52 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s11, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: #APP | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: nop | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra, s0-s11}, 64 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw ra, -4(gp) | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_sw_clobber_s11: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, 4 | |
| ; RV32-XQCCMP-NEXT: sw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x7c # | |
| ; RV32-XQCCMP-NEXT: qc.cm.push {ra, s0-s11}, -64 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset s11, -52 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: #APP | |
| ; RV32-XQCCMP-NEXT: nop | |
| ; RV32-XQCCMP-NEXT: #NO_APP | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra, s0-s11}, 64 | |
| ; RV32-XQCCMP-NEXT: lw ra, -4(gp) | |
| ; RV32-XQCCMP-NEXT: addi gp, gp, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_sw_clobber_s11: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: addi gp, gp, 8 | |
| ; RV64-NEXT: sd ra, -8(gp) | |
| ; RV64-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: sd s11, 0(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: .cfi_offset s11, -16 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: #APP | |
| ; RV64-NEXT: nop | |
| ; RV64-NEXT: #NO_APP | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: ld s11, 0(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: .cfi_restore s11 | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: ld ra, -8(gp) | |
| ; RV64-NEXT: addi gp, gp, -8 | |
| ; RV64-NEXT: .cfi_restore gp | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_sw_clobber_s11: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_12 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset s11, -104 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: #APP | |
| ; RV64-SAVE-RESTORE-NEXT: nop | |
| ; RV64-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 104(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: ld s11, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore s11 | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 112 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_sw_clobber_s11: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-NEXT: cm.push {ra, s0-s11}, -112 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -104 | |
| ; RV64-ZCMP-NEXT: .cfi_offset s11, -8 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: #APP | |
| ; RV64-ZCMP-NEXT: nop | |
| ; RV64-ZCMP-NEXT: #NO_APP | |
| ; RV64-ZCMP-NEXT: cm.pop {ra, s0-s11}, 112 | |
| ; RV64-ZCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_sw_clobber_s11: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, 8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sd ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra, s0-s11}, -112 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -104 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s11, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: #APP | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: nop | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra, s0-s11}, 112 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld ra, -8(gp) | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi gp, gp, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore gp | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_sw_clobber_s11: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, 8 | |
| ; RV64-XQCCMP-NEXT: sd ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: .cfi_escape 0x16, 0x03, 0x02, 0x73, 0x78 # | |
| ; RV64-XQCCMP-NEXT: qc.cm.push {ra, s0-s11}, -112 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset s11, -104 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: #APP | |
| ; RV64-XQCCMP-NEXT: nop | |
| ; RV64-XQCCMP-NEXT: #NO_APP | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra, s0-s11}, 112 | |
| ; RV64-XQCCMP-NEXT: ld ra, -8(gp) | |
| ; RV64-XQCCMP-NEXT: addi gp, gp, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_restore gp | |
| ; RV64-XQCCMP-NEXT: ret | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| call void asm sideeffect "nop", "~{x27}"() | |
| ret i32 %add | |
| } | |
| ;; Hardware Shadow Call Stack | |
| define i32 @caller_hw(i32 %x) "hw-shadow-stack" { | |
| ; RV32-LABEL: caller_hw: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: sspush ra | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: sspopchk ra | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_hw: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_hw: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: sspush ra | |
| ; RV32-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-NEXT: sspopchk ra | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_hw: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_hw: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: sspush ra | |
| ; RV32-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV32-XQCCMP-NEXT: sspopchk ra | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_hw: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: sspush ra | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: sspopchk ra | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_hw: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_hw: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: sspush ra | |
| ; RV64-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-NEXT: sspopchk ra | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_hw: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_hw: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: sspush ra | |
| ; RV64-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV64-XQCCMP-NEXT: sspopchk ra | |
| ; RV64-XQCCMP-NEXT: ret | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| ret i32 %add | |
| } | |
| define i32 @caller_hw_tail(i32 %x) "hw-shadow-stack" { | |
| ; RV32-LABEL: caller_hw_tail: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: tail callee | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_hw_tail: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_hw_tail: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: tail callee | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_hw_tail: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_hw_tail: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: tail callee | |
| ; | |
| ; RV64-LABEL: caller_hw_tail: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: tail callee | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_hw_tail: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_hw_tail: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: tail callee | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_hw_tail: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: tail callee | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_hw_tail: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: tail callee | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| ret i32 %call | |
| } | |
| define i32 @caller_hw_fp(i32 %x) "hw-shadow-stack" "frame-pointer"="all" { | |
| ; RV32-LABEL: caller_hw_fp: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: sspush ra | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: .cfi_offset s0, -8 | |
| ; RV32-NEXT: addi s0, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: .cfi_restore s0 | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: sspopchk ra | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_hw_fp: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset s0, -8 | |
| ; RV32-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_hw_fp: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: sspush ra | |
| ; RV32-ZCMP-NEXT: addi sp, sp, -16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-ZCMP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-NEXT: .cfi_offset s0, -8 | |
| ; RV32-ZCMP-NEXT: addi s0, sp, 16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-ZCMP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-NEXT: .cfi_restore ra | |
| ; RV32-ZCMP-NEXT: .cfi_restore s0 | |
| ; RV32-ZCMP-NEXT: addi sp, sp, 16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-ZCMP-NEXT: sspopchk ra | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_hw_fp: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s0, -8 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: lw s0, 8(sp) # 4-byte Folded Reload | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_hw_fp: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: sspush ra | |
| ; RV32-XQCCMP-NEXT: qc.cm.pushfp {ra, s0}, -16 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset s0, -8 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra, s0}, 16 | |
| ; RV32-XQCCMP-NEXT: sspopchk ra | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_hw_fp: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: sspush ra | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: .cfi_offset s0, -16 | |
| ; RV64-NEXT: addi s0, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: .cfi_restore s0 | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: sspopchk ra | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_hw_fp: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset s0, -16 | |
| ; RV64-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_hw_fp: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: sspush ra | |
| ; RV64-ZCMP-NEXT: addi sp, sp, -16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-ZCMP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-NEXT: .cfi_offset s0, -16 | |
| ; RV64-ZCMP-NEXT: addi s0, sp, 16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-ZCMP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-NEXT: .cfi_restore ra | |
| ; RV64-ZCMP-NEXT: .cfi_restore s0 | |
| ; RV64-ZCMP-NEXT: addi sp, sp, 16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-ZCMP-NEXT: sspopchk ra | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_hw_fp: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call t0, __riscv_save_1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s0, -16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi s0, sp, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ld s0, 0(sp) # 8-byte Folded Reload | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_restore s0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_hw_fp: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: sspush ra | |
| ; RV64-XQCCMP-NEXT: qc.cm.pushfp {ra, s0}, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset s0, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa s0, 0 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa sp, 16 | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra, s0}, 16 | |
| ; RV64-XQCCMP-NEXT: sspopchk ra | |
| ; RV64-XQCCMP-NEXT: ret | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| ret i32 %add | |
| } | |
| define i32 @caller_hw_cond(i32 %x) "hw-shadow-stack" { | |
| ; RV32-LABEL: caller_hw_cond: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: beqz a0, .LBB8_2 | |
| ; RV32-NEXT: # %bb.1: # %if.end | |
| ; RV32-NEXT: sspush ra | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: sspopchk ra | |
| ; RV32-NEXT: ret | |
| ; RV32-NEXT: .LBB8_2: # %return | |
| ; RV32-NEXT: li a0, 1 | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_hw_cond: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: beqz a0, .LBB8_2 | |
| ; RV32-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV32-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; RV32-SAVE-RESTORE-NEXT: .LBB8_2: # %return | |
| ; RV32-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_hw_cond: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: beqz a0, .LBB8_2 | |
| ; RV32-ZCMP-NEXT: # %bb.1: # %if.end | |
| ; RV32-ZCMP-NEXT: sspush ra | |
| ; RV32-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-NEXT: sspopchk ra | |
| ; RV32-ZCMP-NEXT: ret | |
| ; RV32-ZCMP-NEXT: .LBB8_2: # %return | |
| ; RV32-ZCMP-NEXT: li a0, 1 | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_hw_cond: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: beqz a0, .LBB8_2 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .LBB8_2: # %return | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_hw_cond: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: beqz a0, .LBB8_2 | |
| ; RV32-XQCCMP-NEXT: # %bb.1: # %if.end | |
| ; RV32-XQCCMP-NEXT: sspush ra | |
| ; RV32-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV32-XQCCMP-NEXT: sspopchk ra | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; RV32-XQCCMP-NEXT: .LBB8_2: # %return | |
| ; RV32-XQCCMP-NEXT: li a0, 1 | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_hw_cond: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: sext.w a1, a0 | |
| ; RV64-NEXT: beqz a1, .LBB8_2 | |
| ; RV64-NEXT: # %bb.1: # %if.end | |
| ; RV64-NEXT: sspush ra | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: sspopchk ra | |
| ; RV64-NEXT: ret | |
| ; RV64-NEXT: .LBB8_2: # %return | |
| ; RV64-NEXT: li a0, 1 | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_hw_cond: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: sext.w a1, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: beqz a1, .LBB8_2 | |
| ; RV64-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV64-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_0 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 16 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; RV64-SAVE-RESTORE-NEXT: .LBB8_2: # %return | |
| ; RV64-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_hw_cond: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: sext.w a1, a0 | |
| ; RV64-ZCMP-NEXT: beqz a1, .LBB8_2 | |
| ; RV64-ZCMP-NEXT: # %bb.1: # %if.end | |
| ; RV64-ZCMP-NEXT: sspush ra | |
| ; RV64-ZCMP-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-NEXT: sspopchk ra | |
| ; RV64-ZCMP-NEXT: ret | |
| ; RV64-ZCMP-NEXT: .LBB8_2: # %return | |
| ; RV64-ZCMP-NEXT: li a0, 1 | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_hw_cond: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sext.w a1, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: beqz a1, .LBB8_2 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: # %bb.1: # %if.end | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra}, -16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra}, 16 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .LBB8_2: # %return | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: li a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_hw_cond: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: sext.w a1, a0 | |
| ; RV64-XQCCMP-NEXT: beqz a1, .LBB8_2 | |
| ; RV64-XQCCMP-NEXT: # %bb.1: # %if.end | |
| ; RV64-XQCCMP-NEXT: sspush ra | |
| ; RV64-XQCCMP-NEXT: qc.cm.push {ra}, -16 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra}, 16 | |
| ; RV64-XQCCMP-NEXT: sspopchk ra | |
| ; RV64-XQCCMP-NEXT: ret | |
| ; RV64-XQCCMP-NEXT: .LBB8_2: # %return | |
| ; RV64-XQCCMP-NEXT: li a0, 1 | |
| ; RV64-XQCCMP-NEXT: ret | |
| %cmp = icmp eq i32 %x, 0 | |
| br i1 %cmp, label %return, label %if.end | |
| if.end: | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| ret i32 %add | |
| return: | |
| ret i32 1 | |
| } | |
| define i32 @caller_hw_clobber_s11(i32 %x) "hw-shadow-stack" { | |
| ; RV32-LABEL: caller_hw_clobber_s11: | |
| ; RV32: # %bb.0: | |
| ; RV32-NEXT: sspush ra | |
| ; RV32-NEXT: addi sp, sp, -16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: sw s11, 8(sp) # 4-byte Folded Spill | |
| ; RV32-NEXT: .cfi_offset ra, -4 | |
| ; RV32-NEXT: .cfi_offset s11, -8 | |
| ; RV32-NEXT: neg a0, a0 | |
| ; RV32-NEXT: call callee | |
| ; RV32-NEXT: addi a0, a0, 1 | |
| ; RV32-NEXT: #APP | |
| ; RV32-NEXT: nop | |
| ; RV32-NEXT: #NO_APP | |
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: lw s11, 8(sp) # 4-byte Folded Reload | |
| ; RV32-NEXT: .cfi_restore ra | |
| ; RV32-NEXT: .cfi_restore s11 | |
| ; RV32-NEXT: addi sp, sp, 16 | |
| ; RV32-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-NEXT: sspopchk ra | |
| ; RV32-NEXT: ret | |
| ; | |
| ; RV32-SAVE-RESTORE-LABEL: caller_hw_clobber_s11: | |
| ; RV32-SAVE-RESTORE: # %bb.0: | |
| ; RV32-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-SAVE-RESTORE-NEXT: call t0, __riscv_save_12 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset ra, -4 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_offset s11, -52 | |
| ; RV32-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-SAVE-RESTORE-NEXT: #APP | |
| ; RV32-SAVE-RESTORE-NEXT: nop | |
| ; RV32-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV32-SAVE-RESTORE-NEXT: lw ra, 60(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: lw s11, 12(sp) # 4-byte Folded Reload | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_restore s11 | |
| ; RV32-SAVE-RESTORE-NEXT: addi sp, sp, 64 | |
| ; RV32-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV32-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-LABEL: caller_hw_clobber_s11: | |
| ; RV32-ZCMP: # %bb.0: | |
| ; RV32-ZCMP-NEXT: sspush ra | |
| ; RV32-ZCMP-NEXT: cm.push {ra, s0-s11}, -64 | |
| ; RV32-ZCMP-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-ZCMP-NEXT: .cfi_offset ra, -52 | |
| ; RV32-ZCMP-NEXT: .cfi_offset s11, -4 | |
| ; RV32-ZCMP-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-NEXT: call callee | |
| ; RV32-ZCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-NEXT: #APP | |
| ; RV32-ZCMP-NEXT: nop | |
| ; RV32-ZCMP-NEXT: #NO_APP | |
| ; RV32-ZCMP-NEXT: cm.pop {ra, s0-s11}, 64 | |
| ; RV32-ZCMP-NEXT: sspopchk ra | |
| ; RV32-ZCMP-NEXT: ret | |
| ; | |
| ; RV32-ZCMP-SAVE-RESTORE-LABEL: caller_hw_clobber_s11: | |
| ; RV32-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra, s0-s11}, -64 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -52 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s11, -4 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: neg a0, a0 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: addi a0, a0, 1 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: #APP | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: nop | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra, s0-s11}, 64 | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV32-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV32-XQCCMP-LABEL: caller_hw_clobber_s11: | |
| ; RV32-XQCCMP: # %bb.0: | |
| ; RV32-XQCCMP-NEXT: sspush ra | |
| ; RV32-XQCCMP-NEXT: qc.cm.push {ra, s0-s11}, -64 | |
| ; RV32-XQCCMP-NEXT: .cfi_def_cfa_offset 64 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset ra, -4 | |
| ; RV32-XQCCMP-NEXT: .cfi_offset s11, -52 | |
| ; RV32-XQCCMP-NEXT: neg a0, a0 | |
| ; RV32-XQCCMP-NEXT: call callee | |
| ; RV32-XQCCMP-NEXT: addi a0, a0, 1 | |
| ; RV32-XQCCMP-NEXT: #APP | |
| ; RV32-XQCCMP-NEXT: nop | |
| ; RV32-XQCCMP-NEXT: #NO_APP | |
| ; RV32-XQCCMP-NEXT: qc.cm.pop {ra, s0-s11}, 64 | |
| ; RV32-XQCCMP-NEXT: sspopchk ra | |
| ; RV32-XQCCMP-NEXT: ret | |
| ; | |
| ; RV64-LABEL: caller_hw_clobber_s11: | |
| ; RV64: # %bb.0: | |
| ; RV64-NEXT: sspush ra | |
| ; RV64-NEXT: addi sp, sp, -16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | |
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: sd s11, 0(sp) # 8-byte Folded Spill | |
| ; RV64-NEXT: .cfi_offset ra, -8 | |
| ; RV64-NEXT: .cfi_offset s11, -16 | |
| ; RV64-NEXT: negw a0, a0 | |
| ; RV64-NEXT: call callee | |
| ; RV64-NEXT: addiw a0, a0, 1 | |
| ; RV64-NEXT: #APP | |
| ; RV64-NEXT: nop | |
| ; RV64-NEXT: #NO_APP | |
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: ld s11, 0(sp) # 8-byte Folded Reload | |
| ; RV64-NEXT: .cfi_restore ra | |
| ; RV64-NEXT: .cfi_restore s11 | |
| ; RV64-NEXT: addi sp, sp, 16 | |
| ; RV64-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-NEXT: sspopchk ra | |
| ; RV64-NEXT: ret | |
| ; | |
| ; RV64-SAVE-RESTORE-LABEL: caller_hw_clobber_s11: | |
| ; RV64-SAVE-RESTORE: # %bb.0: | |
| ; RV64-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-SAVE-RESTORE-NEXT: call t0, __riscv_save_12 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset ra, -8 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_offset s11, -104 | |
| ; RV64-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-SAVE-RESTORE-NEXT: #APP | |
| ; RV64-SAVE-RESTORE-NEXT: nop | |
| ; RV64-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV64-SAVE-RESTORE-NEXT: ld ra, 104(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: ld s11, 8(sp) # 8-byte Folded Reload | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore ra | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_restore s11 | |
| ; RV64-SAVE-RESTORE-NEXT: addi sp, sp, 112 | |
| ; RV64-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 0 | |
| ; RV64-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-LABEL: caller_hw_clobber_s11: | |
| ; RV64-ZCMP: # %bb.0: | |
| ; RV64-ZCMP-NEXT: sspush ra | |
| ; RV64-ZCMP-NEXT: cm.push {ra, s0-s11}, -112 | |
| ; RV64-ZCMP-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-ZCMP-NEXT: .cfi_offset ra, -104 | |
| ; RV64-ZCMP-NEXT: .cfi_offset s11, -8 | |
| ; RV64-ZCMP-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-NEXT: call callee | |
| ; RV64-ZCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-NEXT: #APP | |
| ; RV64-ZCMP-NEXT: nop | |
| ; RV64-ZCMP-NEXT: #NO_APP | |
| ; RV64-ZCMP-NEXT: cm.pop {ra, s0-s11}, 112 | |
| ; RV64-ZCMP-NEXT: sspopchk ra | |
| ; RV64-ZCMP-NEXT: ret | |
| ; | |
| ; RV64-ZCMP-SAVE-RESTORE-LABEL: caller_hw_clobber_s11: | |
| ; RV64-ZCMP-SAVE-RESTORE: # %bb.0: | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspush ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.push {ra, s0-s11}, -112 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset ra, -104 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: .cfi_offset s11, -8 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: negw a0, a0 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: call callee | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: addiw a0, a0, 1 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: #APP | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: nop | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: #NO_APP | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: cm.pop {ra, s0-s11}, 112 | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: sspopchk ra | |
| ; RV64-ZCMP-SAVE-RESTORE-NEXT: ret | |
| ; | |
| ; RV64-XQCCMP-LABEL: caller_hw_clobber_s11: | |
| ; RV64-XQCCMP: # %bb.0: | |
| ; RV64-XQCCMP-NEXT: sspush ra | |
| ; RV64-XQCCMP-NEXT: qc.cm.push {ra, s0-s11}, -112 | |
| ; RV64-XQCCMP-NEXT: .cfi_def_cfa_offset 112 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset ra, -8 | |
| ; RV64-XQCCMP-NEXT: .cfi_offset s11, -104 | |
| ; RV64-XQCCMP-NEXT: negw a0, a0 | |
| ; RV64-XQCCMP-NEXT: call callee | |
| ; RV64-XQCCMP-NEXT: addiw a0, a0, 1 | |
| ; RV64-XQCCMP-NEXT: #APP | |
| ; RV64-XQCCMP-NEXT: nop | |
| ; RV64-XQCCMP-NEXT: #NO_APP | |
| ; RV64-XQCCMP-NEXT: qc.cm.pop {ra, s0-s11}, 112 | |
| ; RV64-XQCCMP-NEXT: sspopchk ra | |
| ; RV64-XQCCMP-NEXT: ret | |
| %sub = sub nsw i32 0, %x | |
| %call = tail call i32 @callee(i32 %sub) | |
| %add = add nsw i32 %call, 1 | |
| call void asm sideeffect "nop", "~{x27}"() | |
| ret i32 %add | |
| } |