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 @@ -791,6 +791,8 @@ def LLVM_SinOp : LLVM_UnaryIntrinsicOp<"sin">; def LLVM_SqrtOp : LLVM_UnaryIntrinsicOp<"sqrt">; def LLVM_PowOp : LLVM_BinarySameArgsIntrinsicOp<"pow">; +def LLVM_BitReverseOp : LLVM_UnaryIntrinsicOp<"bitreverse">; +def LLVM_CtPopOp : LLVM_UnaryIntrinsicOp<"ctpop">; // // Vector Reductions. diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir --- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir +++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir @@ -103,6 +103,12 @@ // CHECK: "llvm.intr.pow"(%arg1, %arg1) : (!llvm.float, !llvm.float) -> !llvm.float %31 = "llvm.intr.pow"(%arg1, %arg1) : (!llvm.float, !llvm.float) -> !llvm.float +// CHECK: "llvm.intr.bitreverse"(%{{.*}}) : (!llvm.i32) -> !llvm.i32 + %32 = "llvm.intr.bitreverse"(%arg0) : (!llvm.i32) -> !llvm.i32 + +// CHECK: "llvm.intr.ctpop"(%{{.*}}) : (!llvm.i32) -> !llvm.i32 + %33 = "llvm.intr.ctpop"(%arg0) : (!llvm.i32) -> !llvm.i32 + // CHECK: llvm.return llvm.return } 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 @@ -117,6 +117,24 @@ llvm.return } +// CHECK-LABEL: @bitreverse_test +llvm.func @bitreverse_test(%arg0: !llvm.i32, %arg1: !llvm<"<8 x i32>">) { + // CHECK: call i32 @llvm.bitreverse.i32 + "llvm.intr.bitreverse"(%arg0) : (!llvm.i32) -> !llvm.i32 + // CHECK: call <8 x i32> @llvm.bitreverse.v8i32 + "llvm.intr.bitreverse"(%arg1) : (!llvm<"<8 x i32>">) -> !llvm<"<8 x i32>"> + llvm.return +} + +// CHECK-LABEL: @ctpop_test +llvm.func @ctpop_test(%arg0: !llvm.i32, %arg1: !llvm<"<8 x i32>">) { + // CHECK: call i32 @llvm.ctpop.i32 + "llvm.intr.ctpop"(%arg0) : (!llvm.i32) -> !llvm.i32 + // CHECK: call <8 x i32> @llvm.ctpop.v8i32 + "llvm.intr.ctpop"(%arg1) : (!llvm<"<8 x i32>">) -> !llvm<"<8 x i32>"> + llvm.return +} + // CHECK-LABEL: @vector_reductions llvm.func @vector_reductions(%arg0: !llvm.float, %arg1: !llvm<"<8 x float>">, %arg2: !llvm<"<8 x i32>">) { // CHECK: call i32 @llvm.experimental.vector.reduce.add.v8i32