diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td @@ -934,6 +934,43 @@ let arguments = (ins LLVM_AnyVector, LLVM_AnyPointer, LLVM_VectorOf); } +// +// Annotate intrinsics. +// + +def LLVM_VarAnnotation + : LLVM_ZeroResultIntrOp<"var.annotation", [0, 1], + [AllTypesMatch<["annotation", "fileName", "attr"]>]> { + let arguments = (ins LLVM_AnyPointer:$val, + LLVM_AnyPointer:$annotation, + LLVM_AnyPointer:$fileName, + I32:$line, + LLVM_AnyPointer:$attr); +} + +def LLVM_PtrAnnotation + : LLVM_OneResultIntrOp<"ptr.annotation", [0], [2], + [AllTypesMatch<["res", "ptr"]>, + AllTypesMatch<["annotation", "fileName", "attr"]>]> { + let arguments = (ins LLVM_PointerTo:$ptr, + LLVM_AnyPointer:$annotation, + LLVM_AnyPointer:$fileName, + I32:$line, + LLVM_AnyPointer:$attr); + let results = (outs LLVM_PointerTo:$res); +} + +def LLVM_Annotation + : LLVM_OneResultIntrOp<"annotation", [0], [2], + [AllTypesMatch<["res", "integer"]>, + AllTypesMatch<["annotation", "fileName"]>]> { + let arguments = (ins AnySignlessInteger:$integer, + LLVM_AnyPointer:$annotation, + LLVM_AnyPointer:$fileName, + I32:$line); + let results = (outs AnySignlessInteger:$res); +} + // // Trap intrinsics. // diff --git a/mlir/test/Target/LLVMIR/Import/intrinsic.ll b/mlir/test/Target/LLVMIR/Import/intrinsic.ll --- a/mlir/test/Target/LLVMIR/Import/intrinsic.ll +++ b/mlir/test/Target/LLVMIR/Import/intrinsic.ll @@ -436,6 +436,17 @@ ret void } +; CHECK-LABEL: llvm.func @annotate_intrinsics +define void @annotate_intrinsics(ptr %var, ptr %ptr, i16 %int, ptr %annotation, ptr %fileName, i32 %line, ptr %args) { + ; CHECK: "llvm.intr.var.annotation"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (!llvm.ptr, !llvm.ptr, !llvm.ptr, i32, !llvm.ptr) -> () + call void @llvm.var.annotation.p0.p0(ptr %var, ptr %annotation, ptr %fileName, i32 %line, ptr %args) + ; CHECK: %{{.*}} = "llvm.intr.ptr.annotation"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (!llvm.ptr, !llvm.ptr, !llvm.ptr, i32, !llvm.ptr) -> !llvm.ptr + %1 = call ptr @llvm.ptr.annotation.p0.p0(ptr %ptr, ptr %annotation, ptr %fileName, i32 %line, ptr %args) + ; CHECK: %{{.*}} = "llvm.intr.annotation"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (i16, !llvm.ptr, !llvm.ptr, i32) -> i16 + %2 = call i16 @llvm.annotation.i16.p0(i16 %int, ptr %annotation, ptr %fileName, i32 %line) + ret void +} + ; CHECK-LABEL: llvm.func @trap_intrinsics define void @trap_intrinsics() { ; CHECK: "llvm.intr.trap"() : () -> () @@ -946,6 +957,9 @@ declare void @llvm.masked.scatter.v7f32.v7p0(<7 x float>, <7 x ptr>, i32 immarg, <7 x i1>) declare <7 x float> @llvm.masked.expandload.v7f32(ptr, <7 x i1>, <7 x float>) declare void @llvm.masked.compressstore.v7f32(<7 x float>, ptr, <7 x i1>) +declare void @llvm.var.annotation.p0.p0(ptr, ptr, ptr, i32, ptr) +declare ptr @llvm.ptr.annotation.p0.p0(ptr, ptr, ptr, i32, ptr) +declare i16 @llvm.annotation.i16.p0(i16, ptr, ptr, i32) declare void @llvm.trap() declare void @llvm.debugtrap() declare void @llvm.ubsantrap(i8 immarg) diff --git a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir --- a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir +++ b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir @@ -447,6 +447,17 @@ llvm.return } +// CHECK-LABEL: @annotate_intrinsics +llvm.func @annotate_intrinsics(%var: !llvm.ptr, %int: i16, %ptr: !llvm.ptr, %annotation: !llvm.ptr, %fileName: !llvm.ptr, %line: i32, %attr: !llvm.ptr) { + // CHECK: call void @llvm.var.annotation.p0.p0(ptr %{{.*}}, ptr %{{.*}}, ptr %{{.*}}, i32 %{{.*}}, ptr %{{.*}}) + "llvm.intr.var.annotation"(%var, %annotation, %fileName, %line, %attr) : (!llvm.ptr, !llvm.ptr, !llvm.ptr, i32, !llvm.ptr) -> () + // CHECK: call ptr @llvm.ptr.annotation.p0.p0(ptr %{{.*}}, ptr %{{.*}}, ptr %{{.*}}, i32 %{{.*}}, ptr %{{.*}}) + %res0 = "llvm.intr.ptr.annotation"(%ptr, %annotation, %fileName, %line, %attr) : (!llvm.ptr, !llvm.ptr, !llvm.ptr, i32, !llvm.ptr) -> (!llvm.ptr) + // CHECK: call i16 @llvm.annotation.i16.p0(i16 %{{.*}}, ptr %{{.*}}, ptr %{{.*}}, i32 %{{.*}}) + %res1 = "llvm.intr.annotation"(%int, %annotation, %fileName, %line) : (i16, !llvm.ptr, !llvm.ptr, i32) -> (i16) + llvm.return +} + // CHECK-LABEL: @trap_intrinsics llvm.func @trap_intrinsics() { // CHECK: call void @llvm.trap() @@ -976,6 +987,9 @@ // CHECK-DAG: declare void @llvm.masked.scatter.v7f32.v7p0(<7 x float>, <7 x ptr>, i32 immarg, <7 x i1>) // CHECK-DAG: declare <7 x float> @llvm.masked.expandload.v7f32(ptr nocapture, <7 x i1>, <7 x float>) // CHECK-DAG: declare void @llvm.masked.compressstore.v7f32(<7 x float>, ptr nocapture, <7 x i1>) +// CHECK-DAG: declare void @llvm.var.annotation.p0.p0(ptr, ptr, ptr, i32, ptr) +// CHECK-DAG: declare ptr @llvm.ptr.annotation.p0.p0(ptr, ptr, ptr, i32, ptr) +// CHECK-DAG: declare i16 @llvm.annotation.i16.p0(i16, ptr, ptr, i32) // CHECK-DAG: declare void @llvm.trap() // CHECK-DAG: declare void @llvm.debugtrap() // CHECK-DAG: declare void @llvm.ubsantrap(i8 immarg)