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 @@ -419,6 +419,13 @@ def LLVM_AssumeOp : LLVM_ZeroResultIntrOp<"assume", []>, Arguments<(ins I1:$cond)>; +def LLVM_SSACopyOp : LLVM_OneResultIntrOp<"ssa.copy", [], [0], + [Pure, SameOperandsAndResultType]> { + let arguments = (ins AnyType:$operand); + + let assemblyFormat = "$operand attr-dict `:` type($operand)"; +} + def LLVM_IsConstantOp : LLVM_IntrOp<"is.constant", [], [0], [Pure], 1> { let arguments = (ins LLVM_Type:$val); let results = (outs I1:$res); 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 @@ -850,6 +850,13 @@ ret void } +; CHECK-LABEL: llvm.func @ssa_copy +define float @ssa_copy(float %0) { + ; CHECK: %{{.*}} = llvm.intr.ssa.copy %{{.*}} : f32 + %2 = call float @llvm.ssa.copy.f32(float %0) + ret float %2 +} + declare float @llvm.fmuladd.f32(float, float, float) declare <8 x float> @llvm.fmuladd.v8f32(<8 x float>, <8 x float>, <8 x float>) declare float @llvm.fma.f32(float, float, float) @@ -1065,3 +1072,4 @@ declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) declare void @llvm.assume(i1) +declare float @llvm.ssa.copy.f32(float returned) 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 @@ -932,6 +932,13 @@ llvm.return } +// CHECK-LABEL: @ssa_copy +llvm.func @ssa_copy(%arg: f32) -> f32 { + // CHECK: call float @llvm.ssa.copy + %0 = llvm.intr.ssa.copy %arg : f32 + llvm.return %0 : f32 +} + // 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 @@ -1085,3 +1092,4 @@ // CHECK-DAG: declare <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32>, i64 immarg) // CHECK-DAG: declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) // CHECK-DAG: declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) +// CHECK-DAG: declare float @llvm.ssa.copy.f32(float returned)