| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ;; Test that stack protection with vector clobbers and inline asm register |
| ;; constraints works correctly. This is a regression test for issue #198699. It |
| ;; has been produced from the repro case at |
| ;; https://github.com/llvm/llvm-project/issues/198699 |
| ; |
| ; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s --check-prefix=RV64V |
| |
| define range(i64 0, -9223372036854775808) i64 @test_stack_protector_with_vector_clobber(ptr nofree noundef %0) #0 { |
| ; RV64V-LABEL: test_stack_protector_with_vector_clobber: |
| ; RV64V: # %bb.0: |
| ; RV64V-NEXT: li a1, 2 |
| ; RV64V-NEXT: ld t2, 0(a0) |
| ; RV64V-NEXT: #APP |
| ; RV64V-NEXT: #NO_APP |
| ; RV64V-NEXT: bge t2, a1, .LBB0_2 |
| ; RV64V-NEXT: # %bb.1: |
| ; RV64V-NEXT: li a0, 0 |
| ; RV64V-NEXT: ret |
| ; RV64V-NEXT: .LBB0_2: |
| ; RV64V-NEXT: addi sp, sp, -16 |
| ; RV64V-NEXT: csrr t1, vlenb |
| ; RV64V-NEXT: slli t1, t1, 3 |
| ; RV64V-NEXT: lui t0, 1 |
| ; RV64V-NEXT: .LBB0_3: # =>This Inner Loop Header: Depth=1 |
| ; RV64V-NEXT: sub sp, sp, t0 |
| ; RV64V-NEXT: sd zero, 0(sp) |
| ; RV64V-NEXT: sub t1, t1, t0 |
| ; RV64V-NEXT: bge t1, t0, .LBB0_3 |
| ; RV64V-NEXT: # %bb.4: |
| ; RV64V-NEXT: sub sp, sp, t1 |
| ; RV64V-NEXT: vsetivli zero, 8, e64, m8, ta, ma |
| ; RV64V-NEXT: vle64.v v8, (a0) |
| ; RV64V-NEXT: addi a1, sp, 16 |
| ; RV64V-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill |
| ; RV64V-NEXT: #APP |
| ; RV64V-NEXT: #NO_APP |
| ; RV64V-NEXT: vl8r.v v8, (a1) # vscale x 64-byte Folded Reload |
| ; RV64V-NEXT: vsetivli zero, 8, e64, m8, ta, ma |
| ; RV64V-NEXT: vse64.v v8, (a0) |
| ; RV64V-NEXT: csrr a0, vlenb |
| ; RV64V-NEXT: slli a0, a0, 3 |
| ; RV64V-NEXT: add sp, sp, a0 |
| ; RV64V-NEXT: addi sp, sp, 16 |
| ; RV64V-NEXT: mv a0, t2 |
| ; RV64V-NEXT: ret |
| %2 = load i64, ptr %0, align 8 |
| ; Inline asm using register x7 (t2) |
| %3 = tail call i64 asm sideeffect "", "={x7},{x7}"(i64 %2) |
| %4 = icmp slt i64 %3, 2 |
| br i1 %4, label %7, label %5 |
| |
| 5: |
| ; Load vector |
| %6 = tail call <vscale x 8 x i64> @llvm.riscv.vle.nxv8i64.p0.i64(<vscale x 8 x i64> poison, ptr nonnull %0, i64 8) |
| ; Inline asm that clobbers all vector registers |
| tail call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31},~{memory}"() |
| ; Store vector |
| tail call void @llvm.riscv.vse.nxv8i64.p0.i64(<vscale x 8 x i64> %6, ptr nonnull %0, i64 8) |
| br label %7 |
| |
| 7: |
| %8 = phi i64 [ %3, %5 ], [ 0, %1 ] |
| ret i64 %8 |
| } |
| |
| declare <vscale x 8 x i64> @llvm.riscv.vle.nxv8i64.p0.i64(<vscale x 8 x i64>, ptr, i64) |
| declare void @llvm.riscv.vse.nxv8i64.p0.i64(<vscale x 8 x i64>, ptr, i64) |
| |
| attributes #0 = { noinline nounwind "probe-stack"="inline-asm" "stack-protector-buffer-size"="8" "target-cpu"="generic-rv64" "target-features"="+v" } |