[llvm] [CodeGen] @llvm.experimental.stackmap make operands immediate (PR #117932)

via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 27 14:23:32 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir

@llvm/pr-subscribers-backend-systemz

Author: Guillaume DI FATTA (Atafid)

<details>
<summary>Changes</summary>

This pull request modifies the behavior of the `@<!-- -->llvm.experimental.stackmap` intrinsic to require that its two first operands (`id` and `numShadowBytes`) be **immediate values**. This change ensures that variables cannot be passed as two first arguments to this intrinsic.


Related Issue: https://github.com/llvm/llvm-project/issues/115733

### Testing
- Added new test cases to ensure errors are emitted for non-immediate operands.
- Ran the full LLVM test suite to verify no regressions were introduced.

---
Full diff: https://github.com/llvm/llvm-project/pull/117932.diff


6 Files Affected:

- (modified) llvm/include/llvm/IR/Intrinsics.td (+1-1) 
- (added) llvm/test/CodeGen/AArch64/stackmap-args.ll (+44) 
- (added) llvm/test/CodeGen/PowerPC/ppc64-stackmap-args.ll (+58) 
- (added) llvm/test/CodeGen/RISCV/rv64-stackmap-args.ll (+32) 
- (added) llvm/test/CodeGen/SystemZ/stackmap-args.ll (+44) 
- (added) llvm/test/CodeGen/X86/stackmap-args.ll (+44) 


``````````diff
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 1ca8c2565ab0b6..ee877349a33149 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1655,7 +1655,7 @@ def int_strip_invariant_group : DefaultAttrsIntrinsic<[llvm_anyptr_ty],
 //
 def int_experimental_stackmap : DefaultAttrsIntrinsic<[],
                                   [llvm_i64_ty, llvm_i32_ty, llvm_vararg_ty],
-                                  [Throws]>;
+                                  [Throws, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
 def int_experimental_patchpoint_void : Intrinsic<[],
                                                  [llvm_i64_ty, llvm_i32_ty,
                                                   llvm_ptr_ty, llvm_i32_ty,
diff --git a/llvm/test/CodeGen/AArch64/stackmap-args.ll b/llvm/test/CodeGen/AArch64/stackmap-args.ll
new file mode 100644
index 00000000000000..0a7b3a4ab1a329
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/stackmap-args.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s
+; This test is expected to fail.
+; XFAIL:*
+
+; Tests failure when we pass non-immediate args to @llvm.experiment.stackmap
+
+define void @first_arg() {
+; CHECK-LABEL: first_arg:
+; CHECK:       // %bb.0: // %entry
+; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
+; CHECK-NEXT:    mov x29, sp
+; CHECK-NEXT:    .cfi_def_cfa w29, 16
+; CHECK-NEXT:    .cfi_offset w30, -8
+; CHECK-NEXT:    .cfi_offset w29, -16
+; CHECK-NEXT:  .Ltmp0:
+; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
+; CHECK-NEXT:    ret
+entry:
+  ; First operand should be immediate
+  %id = add i64 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 %id, i32 0)
+  ret void
+}
+
+define void @second_arg() {
+; CHECK-LABEL: second_arg:
+; CHECK:       // %bb.0: // %entry
+; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
+; CHECK-NEXT:    mov x29, sp
+; CHECK-NEXT:    .cfi_def_cfa w29, 16
+; CHECK-NEXT:    .cfi_offset w30, -8
+; CHECK-NEXT:    .cfi_offset w29, -16
+; CHECK-NEXT:  .Ltmp1:
+; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
+; CHECK-NEXT:    ret
+entry:
+  ; Second operand should be immediate
+  %numShadowByte = add i32 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 %numShadowByte)
+  ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-stackmap-args.ll b/llvm/test/CodeGen/PowerPC/ppc64-stackmap-args.ll
new file mode 100644
index 00000000000000..597cc7edf16e18
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/ppc64-stackmap-args.ll
@@ -0,0 +1,58 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -verify-machineinstrs < %s -mcpu=ppc -mtriple=powerpc64-unknown-gnu-linux | FileCheck %s
+; This test is expected to fail.
+; XFAIL:*
+
+; Tests failure when we pass non-immediate args to @llvm.experiment.stackmap
+
+define void @first_arg() {
+; CHECK-LABEL: first_arg:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    mflr 0
+; CHECK-NEXT:    std 31, -8(1)
+; CHECK-NEXT:    stdu 1, -64(1)
+; CHECK-NEXT:    std 0, 80(1)
+; CHECK-NEXT:    .cfi_def_cfa_offset 64
+; CHECK-NEXT:    .cfi_offset r31, -8
+; CHECK-NEXT:    .cfi_offset lr, 16
+; CHECK-NEXT:    mr 31, 1
+; CHECK-NEXT:    .cfi_def_cfa_register r31
+; CHECK-NEXT:  .Ltmp0:
+; CHECK-NEXT:    addi 1, 1, 64
+; CHECK-NEXT:    ld 0, 16(1)
+; CHECK-NEXT:    ld 31, -8(1)
+; CHECK-NEXT:    mtlr 0
+; CHECK-NEXT:    blr
+entry:
+  ; First operand should be immediate
+  %id = add i64 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 %id, i32 0)
+  ret void
+}
+
+define void @second_arg() {
+; CHECK-LABEL: second_arg:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    mflr 0
+; CHECK-NEXT:    std 31, -8(1)
+; CHECK-NEXT:    stdu 1, -64(1)
+; CHECK-NEXT:    std 0, 80(1)
+; CHECK-NEXT:    .cfi_def_cfa_offset 64
+; CHECK-NEXT:    .cfi_offset r31, -8
+; CHECK-NEXT:    .cfi_offset lr, 16
+; CHECK-NEXT:    mr 31, 1
+; CHECK-NEXT:    .cfi_def_cfa_register r31
+; CHECK-NEXT:  .Ltmp1:
+; CHECK-NEXT:    addi 1, 1, 64
+; CHECK-NEXT:    ld 0, 16(1)
+; CHECK-NEXT:    ld 31, -8(1)
+; CHECK-NEXT:    mtlr 0
+; CHECK-NEXT:    blr
+entry:
+  ; Second operand should be immediate
+  %numShadowByte = add i32 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 %numShadowByte)
+  ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)
diff --git a/llvm/test/CodeGen/RISCV/rv64-stackmap-args.ll b/llvm/test/CodeGen/RISCV/rv64-stackmap-args.ll
new file mode 100644
index 00000000000000..1fdf56a563f121
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/rv64-stackmap-args.ll
@@ -0,0 +1,32 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=riscv64 < %s | FileCheck %s
+; This test is expected to fail.
+; XFAIL:*
+
+; Tests failure when we pass non-immediate args to @llvm.experiment.stackmap
+
+define void @first_arg() {
+; CHECK-LABEL: first_arg:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:  .Ltmp0:
+; CHECK-NEXT:    ret
+entry:
+  ; First operand should be immediate
+  %id = add i64 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 %id, i32 0)
+  ret void
+}
+
+define void @second_arg() {
+; CHECK-LABEL: second_arg:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:  .Ltmp1:
+; CHECK-NEXT:    ret
+entry:
+  ; Second operand should be immediate
+  %numShadowByte = add i32 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 %numShadowByte)
+  ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)
diff --git a/llvm/test/CodeGen/SystemZ/stackmap-args.ll b/llvm/test/CodeGen/SystemZ/stackmap-args.ll
new file mode 100644
index 00000000000000..1b7767e15eab86
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/stackmap-args.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
+; This test is expected to fail.
+; XFAIL:*
+
+; Tests failure when we pass non-immediate args to @llvm.experiment.stackmap
+
+define void @first_arg() {
+; CHECK-LABEL: first_arg:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:  .Ltmp0:
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
+; CHECK-NEXT:    br %r14
+entry:
+  ; First operand should be immediate
+  %id = add i64 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 %id, i32 0)
+  ret void
+}
+
+define void @second_arg() {
+; CHECK-LABEL: second_arg:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:  .Ltmp1:
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
+; CHECK-NEXT:    br %r14
+entry:
+  ; Second operand should be immediate
+  %numShadowByte = add i32 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 %numShadowByte)
+  ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)
diff --git a/llvm/test/CodeGen/X86/stackmap-args.ll b/llvm/test/CodeGen/X86/stackmap-args.ll
new file mode 100644
index 00000000000000..99aefeb8701f2a
--- /dev/null
+++ b/llvm/test/CodeGen/X86/stackmap-args.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 | FileCheck %s
+; This test is expected to fail.
+; XFAIL:*
+
+; Tests failure when we pass non-immediate args to @llvm.experiment.stackmap
+
+define void @first_arg() {
+; CHECK-LABEL: first_arg:
+; CHECK:       ## %bb.0: ## %entry
+; CHECK-NEXT:    pushq %rbp
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    .cfi_offset %rbp, -16
+; CHECK-NEXT:    movq %rsp, %rbp
+; CHECK-NEXT:    .cfi_def_cfa_register %rbp
+; CHECK-NEXT:  Ltmp0:
+; CHECK-NEXT:    popq %rbp
+; CHECK-NEXT:    retq
+entry:
+  ; First operand should be immediate
+  %id = add i64 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 %id, i32 0)
+  ret void
+}
+
+define void @second_arg() {
+; CHECK-LABEL: second_arg:
+; CHECK:       ## %bb.0: ## %entry
+; CHECK-NEXT:    pushq %rbp
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    .cfi_offset %rbp, -16
+; CHECK-NEXT:    movq %rsp, %rbp
+; CHECK-NEXT:    .cfi_def_cfa_register %rbp
+; CHECK-NEXT:  Ltmp1:
+; CHECK-NEXT:    popq %rbp
+; CHECK-NEXT:    retq
+entry:
+  ; Second operand should be immediate
+  %numShadowByte = add i32 0, 0
+  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 %numShadowByte)
+  ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)

``````````

</details>


https://github.com/llvm/llvm-project/pull/117932


More information about the llvm-commits mailing list