[Mlir-commits] [mlir] 2137915 - [mlir] Remove some code duplication between `Builders.cpp` and `FoldUtils.cpp`
Matthias Springer
llvmlistbot at llvm.org
Thu Jul 20 01:27:27 PDT 2023
Author: Matthias Springer
Date: 2023-07-20T10:27:14+02:00
New Revision: 2137915137acc3cb6f244663f7930a83d1f20b7f
URL: https://github.com/llvm/llvm-project/commit/2137915137acc3cb6f244663f7930a83d1f20b7f
DIFF: https://github.com/llvm/llvm-project/commit/2137915137acc3cb6f244663f7930a83d1f20b7f.diff
LOG: [mlir] Remove some code duplication between `Builders.cpp` and `FoldUtils.cpp`
Also update the documentation of `Operation::fold`, which did not take into account in-place foldings.
Differential Revision: https://reviews.llvm.org/D155691
Added:
Modified:
mlir/include/mlir/IR/Operation.h
mlir/lib/IR/Builders.cpp
mlir/lib/IR/Operation.cpp
mlir/lib/Transforms/Utils/FoldUtils.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/IR/Operation.h b/mlir/include/mlir/IR/Operation.h
index ec6d4ca2d6e6f3..fbded011645c76 100644
--- a/mlir/include/mlir/IR/Operation.h
+++ b/mlir/include/mlir/IR/Operation.h
@@ -679,11 +679,25 @@ class alignas(8) Operation final
/// Attempt to fold this operation with the specified constant operand values
/// - the elements in "operands" will correspond directly to the operands of
- /// the operation, but may be null if non-constant. If folding is successful,
- /// this fills in the `results` vector. If not, `results` is unspecified.
+ /// the operation, but may be null if non-constant.
+ ///
+ /// If folding was successful, this function returns "success".
+ /// * If this operation was modified in-place (but not folded away),
+ /// `results` is empty.
+ /// * Otherwise, `results` is filled with the folded results.
+ /// If folding was unsuccessful, this function returns "failure".
LogicalResult fold(ArrayRef<Attribute> operands,
SmallVectorImpl<OpFoldResult> &results);
+ /// Attempt to fold this operation.
+ ///
+ /// If folding was successful, this function returns "success".
+ /// * If this operation was modified in-place (but not folded away),
+ /// `results` is empty.
+ /// * Otherwise, `results` is filled with the folded results.
+ /// If folding was unsuccessful, this function returns "failure".
+ LogicalResult fold(SmallVectorImpl<OpFoldResult> &results);
+
/// Returns true if the operation was registered with a particular trait, e.g.
/// hasTrait<OperandsAreSignlessIntegerLike>().
template <template <typename T> class Trait>
diff --git a/mlir/lib/IR/Builders.cpp b/mlir/lib/IR/Builders.cpp
index 0f1aceb3ce10fb..b8a98eddfd784d 100644
--- a/mlir/lib/IR/Builders.cpp
+++ b/mlir/lib/IR/Builders.cpp
@@ -475,15 +475,9 @@ LogicalResult OpBuilder::tryFold(Operation *op,
if (matchPattern(op, m_Constant()))
return cleanupFailure();
- // Check to see if any operands to the operation is constant and whether
- // the operation knows how to constant fold itself.
- SmallVector<Attribute, 4> constOperands(op->getNumOperands());
- for (unsigned i = 0, e = constOperands.size(); i != e; ++i)
- matchPattern(op->getOperand(i), m_Constant(&constOperands[i]));
-
// Try to fold the operation.
SmallVector<OpFoldResult, 4> foldResults;
- if (failed(op->fold(constOperands, foldResults)) || foldResults.empty())
+ if (failed(op->fold(foldResults)) || foldResults.empty())
return cleanupFailure();
// A temporary builder used for creating constants during folding.
diff --git a/mlir/lib/IR/Operation.cpp b/mlir/lib/IR/Operation.cpp
index efce8d92015087..1c70bc3d218285 100644
--- a/mlir/lib/IR/Operation.cpp
+++ b/mlir/lib/IR/Operation.cpp
@@ -628,6 +628,15 @@ LogicalResult Operation::fold(ArrayRef<Attribute> operands,
return interface->fold(this, operands, results);
}
+LogicalResult Operation::fold(SmallVectorImpl<OpFoldResult> &results) {
+ // Check if any operands are constants.
+ SmallVector<Attribute> constants;
+ constants.assign(getNumOperands(), Attribute());
+ for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
+ matchPattern(getOperand(i), m_Constant(&constants[i]));
+ return fold(constants, results);
+}
+
/// Emit an error with the op name prefixed, like "'dim' op " which is
/// convenient for verifiers.
InFlightDiagnostic Operation::emitOpError(const Twine &message) {
diff --git a/mlir/lib/Transforms/Utils/FoldUtils.cpp b/mlir/lib/Transforms/Utils/FoldUtils.cpp
index ad1e0436c64d61..90ee5ba51de3ad 100644
--- a/mlir/lib/Transforms/Utils/FoldUtils.cpp
+++ b/mlir/lib/Transforms/Utils/FoldUtils.cpp
@@ -215,19 +215,8 @@ bool OperationFolder::isFolderOwnedConstant(Operation *op) const {
/// `results` with the results of the folding.
LogicalResult OperationFolder::tryToFold(Operation *op,
SmallVectorImpl<Value> &results) {
- SmallVector<Attribute, 8> operandConstants;
-
- // Check to see if any operands to the operation is constant and whether
- // the operation knows how to constant fold itself.
- operandConstants.assign(op->getNumOperands(), Attribute());
- for (unsigned i = 0, e = op->getNumOperands(); i != e; ++i)
- matchPattern(op->getOperand(i), m_Constant(&operandConstants[i]));
-
- // Attempt to constant fold the operation. If we failed, check to see if we at
- // least updated the operands of the operation. We treat this as an in-place
- // fold.
SmallVector<OpFoldResult, 8> foldResults;
- if (failed(op->fold(operandConstants, foldResults)) ||
+ if (failed(op->fold(foldResults)) ||
failed(processFoldResults(op, results, foldResults)))
return failure();
return success();
More information about the Mlir-commits
mailing list