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 @@ -1359,7 +1359,7 @@ } def LLVM_ConstantOp - : LLVM_Op<"mlir.constant", [NoSideEffect]>, + : LLVM_Op<"mlir.constant", [NoSideEffect, ConstantLike]>, LLVM_Builder<[{$res = getLLVMConstant($_resultType, $value, $_location, moduleTranslation);}]> { @@ -1398,6 +1398,7 @@ let builders = [LLVM_OneResultOpBuilder]; let assemblyFormat = "`(` $value `)` attr-dict `:` type($res)"; let verifier = [{ return ::verify(*this); }]; + let hasFolder = 1; } // Operations that correspond to LLVM intrinsics. With MLIR operation set being diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp @@ -2085,6 +2085,9 @@ return success(); } +// Constant op constant-folds to its value. +OpFoldResult LLVM::ConstantOp::fold(ArrayRef) { return getValue(); } + //===----------------------------------------------------------------------===// // Utility functions for parsing atomic ops //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/LLVMIR/canonicalize.mlir b/mlir/test/Dialect/LLVMIR/canonicalize.mlir --- a/mlir/test/Dialect/LLVMIR/canonicalize.mlir +++ b/mlir/test/Dialect/LLVMIR/canonicalize.mlir @@ -38,3 +38,20 @@ llvm.return %3 : f32 } + +// ----- + +// Check that LLVM constants participate in cross-dialect constant folding. The +// resulting constant is created in the arith dialect because the last folded +// operation belongs to it. +// CHECK-LABEL: llvm_constant +func @llvm_constant() -> i32 { + // CHECK-NOT: llvm.mlir.constant + %0 = llvm.mlir.constant(40 : i32) : i32 + %1 = llvm.mlir.constant(42 : i32) : i32 + // CHECK: %[[RES:.*]] = arith.constant 82 : i32 + // CHECK-NOT: arith.addi + %2 = arith.addi %0, %1 : i32 + // CHECK: return %[[RES]] + return %2 : i32 +}