================ @@ -1419,6 +1419,50 @@ def CallOp : CIR_CallOpBase<"call", [NoRegionArguments]> { }]>]; } +//===----------------------------------------------------------------------===// +// StackSave & StackRestoreOp +//===----------------------------------------------------------------------===// + +def StackSaveOp : CIR_Op<"stacksave"> { + let summary = "remembers the current state of the function stack"; + let description = [{ + Remembers the current state of the function stack. Returns a pointer + that later can be passed into cir.stackrestore. + Useful for implementing language features like variable length arrays. + + This operation corresponds to LLVM intrinsic `stacksave`. + + ```mlir + %0 = cir.stacksave : <!u8i> + ``` + }]; + + let results = (outs CIR_PointerType:$result); + let assemblyFormat = "attr-dict `:` qualified(type($result))"; +} + +def StackRestoreOp : CIR_Op<"stackrestore"> { + let summary = "restores the state of the function stack"; + let description = [{ + Restore the state of the function stack to the state it was + in when the corresponding cir.stacksave executed. + Useful for implementing language features like variable length arrays. ---------------- andykaylor wrote:
```suggestion This is used during the lowering of variable length array allocas. ``` https://github.com/llvm/llvm-project/pull/136426 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits