diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -1277,6 +1277,19 @@ let assemblyFormat = "$handle attr-dict"; } +// +// Stack save/restore intrinsics. +// + +def LLVM_StackSaveOp : LLVM_IntrOp<"stacksave", [], [], [], 1> { + let assemblyFormat = "attr-dict `:` type($res)"; +} + +def LLVM_StackRestoreOp : LLVM_IntrOp<"stackrestore", [], [], [], 0> { + let arguments = (ins LLVM_i8Ptr:$ptr); + let assemblyFormat = "$ptr attr-dict"; +} + // // Vector Reductions. // diff --git a/mlir/test/Target/llvmir-intrinsics.mlir b/mlir/test/Target/llvmir-intrinsics.mlir --- a/mlir/test/Target/llvmir-intrinsics.mlir +++ b/mlir/test/Target/llvmir-intrinsics.mlir @@ -380,14 +380,14 @@ // CHECK-LABEL: @coro_suspend llvm.func @coro_suspend(%arg0: !llvm.token, %arg1 : i1) { // CHECK: call i8 @llvm.coro.suspend - %0 = llvm.intr.coro.suspend %arg0, %arg1 : !llvm.i8 + %0 = llvm.intr.coro.suspend %arg0, %arg1 : i8 llvm.return } // CHECK-LABEL: @coro_end llvm.func @coro_end(%arg0: !llvm.ptr, %arg1 : i1) { // CHECK: call i1 @llvm.coro.end - %0 = llvm.intr.coro.end %arg0, %arg1 : !llvm.i1 + %0 = llvm.intr.coro.end %arg0, %arg1 : i1 llvm.return } @@ -405,6 +405,20 @@ llvm.return } +// CHECK-LABEL: @stack_save +llvm.func @stack_save() { + // CHECK: call i8* @llvm.stacksave + %0 = llvm.intr.stacksave : !llvm.ptr + llvm.return +} + +// CHECK-LABEL: @stack_restore +llvm.func @stack_restore(%arg0: !llvm.ptr) { + // CHECK: call void @llvm.stackrestore + llvm.intr.stackrestore %arg0 + llvm.return +} + // Check that intrinsics are declared with appropriate types. // CHECK-DAG: declare float @llvm.fma.f32(float, float, float) // CHECK-DAG: declare <8 x float> @llvm.fma.v8f32(<8 x float>, <8 x float>, <8 x float>) #0