[Mlir-commits] [mlir] [mlir] [LLVM IR] Introduce VaArgOp (PR #109260)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Sep 19 02:49:21 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Chuanqi Xu (ChuanqiXu9)
<details>
<summary>Changes</summary>
I find there is no LLVMOp corresponding to LLVM's [va_arg instruction](https://llvm.org/docs/LangRef.html#va-arg-instruction) so I tried to add one. This is helpful for clangir (https://github.com/llvm/clangir/pull/865).
New to MLIR and not sure who are the appropriate reviewers. Appreciated in ahead for reviewing and triaging.
---
Full diff: https://github.com/llvm/llvm-project/pull/109260.diff
2 Files Affected:
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td (+20)
- (modified) mlir/test/Target/LLVMIR/llvmir.mlir (+6-4)
``````````diff
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index d956d7f27f784d..862180ac940aac 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -582,6 +582,26 @@ def LLVM_LandingpadOp : LLVM_Op<"landingpad"> {
let hasVerifier = 1;
}
+//===----------------------------------------------------------------------===//
+// VAArgOp
+//===----------------------------------------------------------------------===//
+
+def LLVM_VaArgOp : LLVM_Op<"va_arg"> {
+ let arguments = (ins LLVM_AnyPointer:$arg);
+ let results = (outs LLVM_Type:$res);
+
+ let builders = [LLVM_OneResultOpBuilder];
+
+ let llvmBuilder = " $res = builder.CreateVAArg($arg, $_resultType); ";
+ let assemblyFormat = "$arg attr-dict `:` `(` type($arg) `)` `->` type($res)";
+
+ string llvmInstName = "VAArg";
+ string mlirBuilder = [{
+ $res = $_builder.create<mlir::LLVM::VaArgOp>(
+ $_location, $_resultType, $arg);
+ }];
+}
+
//===----------------------------------------------------------------------===//
// CallOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 7eca1a40373054..de0ab1b3442671 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -2275,8 +2275,8 @@ llvm.func @qux(f32)
// CHECK: %struct.va_list = type { ptr }
-// CHECK: define void @vararg_function(i32 %{{.*}}, ...)
-llvm.func @vararg_function(%arg0: i32, ...) {
+// CHECK: define i32 @vararg_function(i32 %{{.*}}, ...)
+llvm.func @vararg_function(%arg0: i32, ...) -> i32 {
%0 = llvm.mlir.constant(1 : i32) : i32
%1 = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[ALLOCA0:.+]] = alloca %struct.va_list, align 8
@@ -2287,12 +2287,14 @@ llvm.func @vararg_function(%arg0: i32, ...) {
%4 = llvm.alloca %0 x !llvm.ptr {alignment = 8 : i64} : (i32) -> !llvm.ptr
// CHECK: call void @llvm.va_copy.p0(ptr %[[ALLOCA1]], ptr %[[ALLOCA0]])
llvm.intr.vacopy %2 to %4 : !llvm.ptr, !llvm.ptr
+ // CHECK: %[[RET:.+]] = va_arg ptr %[[ALLOCA1]], i32
+ %ret = llvm.va_arg %4 : (!llvm.ptr) -> i32
// CHECK: call void @llvm.va_end.p0(ptr %[[ALLOCA1]])
// CHECK: call void @llvm.va_end.p0(ptr %[[ALLOCA0]])
llvm.intr.vaend %4 : !llvm.ptr
llvm.intr.vaend %2 : !llvm.ptr
- // CHECK: ret void
- llvm.return
+ // CHECK: ret i32 %[[RET]]
+ llvm.return %ret : i32
}
// -----
``````````
</details>
https://github.com/llvm/llvm-project/pull/109260
More information about the Mlir-commits
mailing list