[Mlir-commits] [mlir] e84a9b9 - [mlir][Affine] NFC - Drop Affine EDSC usage

Nicolas Vasilache llvmlistbot at llvm.org
Thu May 20 14:45:51 PDT 2021


Author: Nicolas Vasilache
Date: 2021-05-20T21:45:45Z
New Revision: e84a9b9bb3051c35dea993cdad7b3d2575638f85

URL: https://github.com/llvm/llvm-project/commit/e84a9b9bb3051c35dea993cdad7b3d2575638f85
DIFF: https://github.com/llvm/llvm-project/commit/e84a9b9bb3051c35dea993cdad7b3d2575638f85.diff

LOG: [mlir][Affine] NFC - Drop Affine EDSC usage

Drop the Affine dialect EDSC subdirectory and update all uses.

Differential Revision: https://reviews.llvm.org/D102878

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/Linalg/Utils/Utils.h
    mlir/include/mlir/Dialect/StandardOps/Utils/Utils.h
    mlir/lib/Conversion/VectorToSCF/CMakeLists.txt
    mlir/lib/Dialect/Affine/CMakeLists.txt
    mlir/lib/Dialect/Linalg/Transforms/Loops.cpp
    mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
    mlir/lib/Dialect/Linalg/Utils/CMakeLists.txt
    mlir/lib/Dialect/Linalg/Utils/Utils.cpp
    mlir/lib/Dialect/StandardOps/Utils/Utils.cpp
    mlir/test/Dialect/Linalg/tile-and-fuse-tensors.mlir

Removed: 
    mlir/include/mlir/Dialect/Affine/EDSC/Builders.h
    mlir/include/mlir/Dialect/Affine/EDSC/Intrinsics.h
    mlir/lib/Dialect/Affine/EDSC/Builders.cpp
    mlir/lib/Dialect/Affine/EDSC/CMakeLists.txt


################################################################################
diff  --git a/mlir/include/mlir/Dialect/Affine/EDSC/Builders.h b/mlir/include/mlir/Dialect/Affine/EDSC/Builders.h
deleted file mode 100644
index 40b814fd95a81..0000000000000
--- a/mlir/include/mlir/Dialect/Affine/EDSC/Builders.h
+++ /dev/null
@@ -1,95 +0,0 @@
-//===- Builders.h - MLIR Declarative Builder Classes ------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Provides intuitive composable interfaces for building structured MLIR
-// snippets in a declarative fashion.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_DIALECT_AFFINE_EDSC_BUILDERS_H_
-#define MLIR_DIALECT_AFFINE_EDSC_BUILDERS_H_
-
-#include "mlir/Dialect/Affine/IR/AffineOps.h"
-#include "mlir/EDSC/Builders.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/Types.h"
-
-namespace mlir {
-namespace edsc {
-
-/// Creates a perfect nest of affine "for" loops, given the list of lower
-/// bounds, upper bounds and steps. The three lists are expected to contain the
-/// same number of elements. Uses the OpBuilder and Location stored in
-/// ScopedContext and assumes they are non-null. The optional "bodyBuilderFn"
-/// callback is called to construct the body of the innermost loop and is passed
-/// the list of loop induction variables, in order from outermost to innermost.
-/// The function is expected to use the builder and location stored in
-/// ScopedContext at the moment of the call. The function should not create
-/// the affine terminator op, which will be added regardless of the
-/// "bodyBuilderFn" being present.
-void affineLoopNestBuilder(
-    ValueRange lbs, ValueRange ubs, ArrayRef<int64_t> steps,
-    function_ref<void(ValueRange)> bodyBuilderFn = nullptr);
-
-/// Creates a single affine "for" loop, iterating from max(lbs) to min(ubs) with
-/// the given step. Uses the OpBuilder and Location stored in ScopedContext and
-/// assumes they are non-null. The optional "bodyBuilderFn" callback is called
-/// to construct the body of the loop and is passed the induction variable. The
-/// function is expected to use the builder and location stored in ScopedContext
-/// at the moment of the call. The function should not create the affine
-/// terminator op, which will be added regardless of the "bodyBuilderFn" being
-/// present.
-void affineLoopBuilder(ValueRange lbs, ValueRange ubs, int64_t step,
-                       function_ref<void(Value)> bodyBuilderFn = nullptr);
-
-/// Creates a single affine "for" loop, iterating from max(lbs) to min(ubs) with
-/// the given step. Uses the OpBuilder and Location stored in ScopedContext and
-/// assumes they are non-null. "iterArgs" is used to specify the initial values
-/// of the result affine "for" might yield. The optional "bodyBuilderFn"
-/// callback is called to construct the body of the loop and is passed the
-/// induction variable and the iteration arguments. The function is expected to
-/// use the builder and location stored in ScopedContext at the moment of the
-/// call. The function will create the affine terminator op in case "iterArgs"
-/// is empty and "bodyBuilderFn" is not present.
-void affineLoopBuilder(
-    ValueRange lbs, ValueRange ubs, int64_t step, ValueRange iterArgs,
-    function_ref<void(Value, ValueRange)> bodyBuilderFn = nullptr);
-namespace op {
-
-Value operator+(Value lhs, Value rhs);
-Value operator-(Value lhs, Value rhs);
-Value operator*(Value lhs, Value rhs);
-Value operator/(Value lhs, Value rhs);
-Value operator%(Value lhs, Value rhs);
-Value floorDiv(Value lhs, Value rhs);
-Value ceilDiv(Value lhs, Value rhs);
-
-/// Logical operator overloadings.
-Value negate(Value value);
-Value operator&&(Value lhs, Value rhs);
-Value operator||(Value lhs, Value rhs);
-Value operator^(Value lhs, Value rhs);
-
-/// Comparison operator overloadings.
-Value eq(Value lhs, Value rhs);
-Value ne(Value lhs, Value rhs);
-Value slt(Value lhs, Value rhs);
-Value sle(Value lhs, Value rhs);
-Value sgt(Value lhs, Value rhs);
-Value sge(Value lhs, Value rhs);
-Value ult(Value lhs, Value rhs);
-Value ule(Value lhs, Value rhs);
-Value ugt(Value lhs, Value rhs);
-Value uge(Value lhs, Value rhs);
-
-} // namespace op
-
-} // namespace edsc
-} // namespace mlir
-
-#endif // MLIR_DIALECT_AFFINE_EDSC_BUILDERS_H_

diff  --git a/mlir/include/mlir/Dialect/Affine/EDSC/Intrinsics.h b/mlir/include/mlir/Dialect/Affine/EDSC/Intrinsics.h
deleted file mode 100644
index ffb420b311259..0000000000000
--- a/mlir/include/mlir/Dialect/Affine/EDSC/Intrinsics.h
+++ /dev/null
@@ -1,28 +0,0 @@
-//===- Intrinsics.h - MLIR EDSC Intrinsics for AffineOps --------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-#ifndef MLIR_DIALECT_AFFINE_EDSC_INTRINSICS_H_
-#define MLIR_DIALECT_AFFINE_EDSC_INTRINSICS_H_
-
-#include "mlir/Dialect/Affine/EDSC/Builders.h"
-
-namespace mlir {
-namespace edsc {
-namespace intrinsics {
-
-using affine_apply = ValueBuilder<AffineApplyOp>;
-using affine_if = OperationBuilder<AffineIfOp>;
-using affine_load = ValueBuilder<AffineLoadOp>;
-using affine_min = ValueBuilder<AffineMinOp>;
-using affine_max = ValueBuilder<AffineMaxOp>;
-using affine_store = OperationBuilder<AffineStoreOp>;
-
-} // namespace intrinsics
-} // namespace edsc
-} // namespace mlir
-
-#endif // MLIR_DIALECT_STANDARDOPS_EDSC_INTRINSICS_H_

diff  --git a/mlir/include/mlir/Dialect/Linalg/Utils/Utils.h b/mlir/include/mlir/Dialect/Linalg/Utils/Utils.h
index 7c9fdb21823ff..33c511d4abe4a 100644
--- a/mlir/include/mlir/Dialect/Linalg/Utils/Utils.h
+++ b/mlir/include/mlir/Dialect/Linalg/Utils/Utils.h
@@ -9,7 +9,6 @@
 #ifndef MLIR_DIALECT_LINALG_UTILS_H_
 #define MLIR_DIALECT_LINALG_UTILS_H_
 
-#include "mlir/Dialect/Affine/EDSC/Intrinsics.h"
 #include "mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h"
 #include "mlir/Dialect/Linalg/IR/LinalgOps.h"
 #include "mlir/Dialect/SCF/SCF.h"

diff  --git a/mlir/include/mlir/Dialect/StandardOps/Utils/Utils.h b/mlir/include/mlir/Dialect/StandardOps/Utils/Utils.h
index c9a2f5ae13d5e..fd668ba5d87a6 100644
--- a/mlir/include/mlir/Dialect/StandardOps/Utils/Utils.h
+++ b/mlir/include/mlir/Dialect/StandardOps/Utils/Utils.h
@@ -72,6 +72,22 @@ class OpWithOffsetSizesAndStridesConstantArgumentFolder final
   }
 };
 
+/// Helper struct to build simple arithmetic quantities with minimal type
+/// inference support.
+struct ArithBuilder {
+  ArithBuilder(OpBuilder &b, Location loc) : b(b), loc(loc) {}
+
+  Value _and(Value lhs, Value rhs);
+  Value add(Value lhs, Value rhs);
+  Value mul(Value lhs, Value rhs);
+  Value select(Value cmp, Value lhs, Value rhs);
+  Value sgt(Value lhs, Value rhs);
+  Value slt(Value lhs, Value rhs);
+
+private:
+  OpBuilder &b;
+  Location loc;
+};
 } // end namespace mlir
 
 #endif // MLIR_DIALECT_STANDARDOPS_UTILS_UTILS_H

diff  --git a/mlir/lib/Conversion/VectorToSCF/CMakeLists.txt b/mlir/lib/Conversion/VectorToSCF/CMakeLists.txt
index 2a7ee5ea8a58d..5c348928608a6 100644
--- a/mlir/lib/Conversion/VectorToSCF/CMakeLists.txt
+++ b/mlir/lib/Conversion/VectorToSCF/CMakeLists.txt
@@ -9,7 +9,6 @@ add_mlir_conversion_library(MLIRVectorToSCF
 
   LINK_LIBS PUBLIC
   MLIREDSC
-  MLIRAffineEDSC
   MLIRLLVMIR
   MLIRMemRef
   MLIRTransforms

diff  --git a/mlir/lib/Dialect/Affine/CMakeLists.txt b/mlir/lib/Dialect/Affine/CMakeLists.txt
index 018cb0ba94a51..31167e6af908b 100644
--- a/mlir/lib/Dialect/Affine/CMakeLists.txt
+++ b/mlir/lib/Dialect/Affine/CMakeLists.txt
@@ -1,4 +1,3 @@
 add_subdirectory(IR)
-add_subdirectory(EDSC)
 add_subdirectory(Transforms)
 add_subdirectory(Utils)

diff  --git a/mlir/lib/Dialect/Affine/EDSC/Builders.cpp b/mlir/lib/Dialect/Affine/EDSC/Builders.cpp
deleted file mode 100644
index 11926d26368be..0000000000000
--- a/mlir/lib/Dialect/Affine/EDSC/Builders.cpp
+++ /dev/null
@@ -1,296 +0,0 @@
-//===- Builders.cpp - MLIR Declarative Builder Classes --------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Dialect/Affine/EDSC/Builders.h"
-#include "mlir/Dialect/StandardOps/EDSC/Builders.h"
-#include "mlir/IR/AffineExpr.h"
-#include "mlir/IR/AffineMap.h"
-
-using namespace mlir;
-using namespace mlir::edsc;
-
-void mlir::edsc::affineLoopNestBuilder(
-    ValueRange lbs, ValueRange ubs, ArrayRef<int64_t> steps,
-    function_ref<void(ValueRange)> bodyBuilderFn) {
-  assert(ScopedContext::getContext() && "EDSC ScopedContext not set up");
-
-  // Wrap the body builder function into an interface compatible with the main
-  // builder.
-  auto wrappedBuilderFn = [&](OpBuilder &nestedBuilder, Location nestedLoc,
-                              ValueRange ivs) {
-    ScopedContext context(nestedBuilder, nestedLoc);
-    bodyBuilderFn(ivs);
-  };
-  function_ref<void(OpBuilder &, Location, ValueRange)> wrapper;
-  if (bodyBuilderFn)
-    wrapper = wrappedBuilderFn;
-
-  // Extract the builder, location and construct the loop nest.
-  OpBuilder &builder = ScopedContext::getBuilderRef();
-  Location loc = ScopedContext::getLocation();
-  buildAffineLoopNest(builder, loc, lbs, ubs, steps, wrapper);
-}
-
-void mlir::edsc::affineLoopBuilder(ValueRange lbs, ValueRange ubs, int64_t step,
-                                   function_ref<void(Value)> bodyBuilderFn) {
-  // Fetch the builder and location.
-  assert(ScopedContext::getContext() && "EDSC ScopedContext not set up");
-  OpBuilder &builder = ScopedContext::getBuilderRef();
-  Location loc = ScopedContext::getLocation();
-
-  // Create the actual loop and call the body builder, if provided, after
-  // updating the scoped context.
-  builder.create<AffineForOp>(
-      loc, lbs, builder.getMultiDimIdentityMap(lbs.size()), ubs,
-      builder.getMultiDimIdentityMap(ubs.size()), step, llvm::None,
-      [&](OpBuilder &nestedBuilder, Location nestedLoc, Value iv,
-          ValueRange itrArgs) {
-        if (bodyBuilderFn) {
-          ScopedContext nestedContext(nestedBuilder, nestedLoc);
-          OpBuilder::InsertionGuard guard(nestedBuilder);
-          bodyBuilderFn(iv);
-        }
-        nestedBuilder.create<AffineYieldOp>(nestedLoc);
-      });
-}
-
-void mlir::edsc::affineLoopBuilder(
-    ValueRange lbs, ValueRange ubs, int64_t step, ValueRange iterArgs,
-    function_ref<void(Value, ValueRange)> bodyBuilderFn) {
-  // Fetch the builder and location.
-  assert(ScopedContext::getContext() && "EDSC ScopedContext not set up");
-  OpBuilder &builder = ScopedContext::getBuilderRef();
-  Location loc = ScopedContext::getLocation();
-
-  // Create the actual loop and call the body builder, if provided, after
-  // updating the scoped context.
-  builder.create<AffineForOp>(
-      loc, lbs, builder.getMultiDimIdentityMap(lbs.size()), ubs,
-      builder.getMultiDimIdentityMap(ubs.size()), step, iterArgs,
-      [&](OpBuilder &nestedBuilder, Location nestedLoc, Value iv,
-          ValueRange itrArgs) {
-        if (bodyBuilderFn) {
-          ScopedContext nestedContext(nestedBuilder, nestedLoc);
-          OpBuilder::InsertionGuard guard(nestedBuilder);
-          bodyBuilderFn(iv, itrArgs);
-        } else if (itrArgs.empty())
-          nestedBuilder.create<AffineYieldOp>(nestedLoc);
-      });
-}
-
-static std::pair<AffineExpr, Value>
-categorizeValueByAffineType(MLIRContext *context, Value val, unsigned &numDims,
-                            unsigned &numSymbols) {
-  AffineExpr d;
-  Value resultVal = nullptr;
-  if (auto constant = val.getDefiningOp<ConstantIndexOp>()) {
-    d = getAffineConstantExpr(constant.getValue(), context);
-  } else if (isValidSymbol(val) && !isValidDim(val)) {
-    d = getAffineSymbolExpr(numSymbols++, context);
-    resultVal = val;
-  } else {
-    d = getAffineDimExpr(numDims++, context);
-    resultVal = val;
-  }
-  return std::make_pair(d, resultVal);
-}
-
-static Value createBinaryIndexHandle(
-    Value lhs, Value rhs,
-    function_ref<AffineExpr(AffineExpr, AffineExpr)> affCombiner) {
-  MLIRContext *context = ScopedContext::getContext();
-  unsigned numDims = 0, numSymbols = 0;
-  AffineExpr d0, d1;
-  Value v0, v1;
-  std::tie(d0, v0) =
-      categorizeValueByAffineType(context, lhs, numDims, numSymbols);
-  std::tie(d1, v1) =
-      categorizeValueByAffineType(context, rhs, numDims, numSymbols);
-  SmallVector<Value, 2> operands;
-  if (v0)
-    operands.push_back(v0);
-  if (v1)
-    operands.push_back(v1);
-  auto map = AffineMap::get(numDims, numSymbols, affCombiner(d0, d1));
-
-  // TODO: createOrFold when available.
-  Operation *op =
-      makeComposedAffineApply(ScopedContext::getBuilderRef(),
-                              ScopedContext::getLocation(), map, operands)
-          .getOperation();
-  assert(op->getNumResults() == 1 && "Expected single result AffineApply");
-  return op->getResult(0);
-}
-
-template <typename IOp, typename FOp>
-static Value createBinaryHandle(
-    Value lhs, Value rhs,
-    function_ref<AffineExpr(AffineExpr, AffineExpr)> affCombiner) {
-  auto thisType = lhs.getType();
-  auto thatType = rhs.getType();
-  assert(thisType == thatType && "cannot mix types in operators");
-  (void)thisType;
-  (void)thatType;
-  if (thisType.isIndex()) {
-    return createBinaryIndexHandle(lhs, rhs, affCombiner);
-  } else if (thisType.isSignlessInteger()) {
-    return ValueBuilder<IOp>(lhs, rhs);
-  } else if (thisType.isa<FloatType>()) {
-    return ValueBuilder<FOp>(lhs, rhs);
-  } else if (thisType.isa<VectorType, TensorType>()) {
-    auto aggregateType = thisType.cast<ShapedType>();
-    if (aggregateType.getElementType().isSignlessInteger())
-      return ValueBuilder<IOp>(lhs, rhs);
-    else if (aggregateType.getElementType().isa<FloatType>())
-      return ValueBuilder<FOp>(lhs, rhs);
-  }
-  llvm_unreachable("failed to create a Value");
-}
-
-Value mlir::edsc::op::operator+(Value lhs, Value rhs) {
-  return createBinaryHandle<AddIOp, AddFOp>(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) { return d0 + d1; });
-}
-
-Value mlir::edsc::op::operator-(Value lhs, Value rhs) {
-  return createBinaryHandle<SubIOp, SubFOp>(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) { return d0 - d1; });
-}
-
-Value mlir::edsc::op::operator*(Value lhs, Value rhs) {
-  return createBinaryHandle<MulIOp, MulFOp>(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) { return d0 * d1; });
-}
-
-Value mlir::edsc::op::operator/(Value lhs, Value rhs) {
-  return createBinaryHandle<SignedDivIOp, DivFOp>(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) -> AffineExpr {
-        llvm_unreachable("only exprs of non-index type support operator/");
-      });
-}
-
-Value mlir::edsc::op::operator%(Value lhs, Value rhs) {
-  return createBinaryHandle<SignedRemIOp, RemFOp>(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) { return d0 % d1; });
-}
-
-Value mlir::edsc::op::floorDiv(Value lhs, Value rhs) {
-  return createBinaryIndexHandle(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) { return d0.floorDiv(d1); });
-}
-
-Value mlir::edsc::op::ceilDiv(Value lhs, Value rhs) {
-  return createBinaryIndexHandle(
-      lhs, rhs, [](AffineExpr d0, AffineExpr d1) { return d0.ceilDiv(d1); });
-}
-
-Value mlir::edsc::op::negate(Value value) {
-  assert(value.getType().isInteger(1) && "expected boolean expression");
-  return ValueBuilder<ConstantIntOp>(1, 1) - value;
-}
-
-Value mlir::edsc::op::operator&&(Value lhs, Value rhs) {
-  assert(lhs.getType().isInteger(1) && "expected boolean expression on LHS");
-  assert(rhs.getType().isInteger(1) && "expected boolean expression on RHS");
-  return ValueBuilder<AndOp>(lhs, rhs);
-}
-
-Value mlir::edsc::op::operator||(Value lhs, Value rhs) {
-  assert(lhs.getType().isInteger(1) && "expected boolean expression on LHS");
-  assert(rhs.getType().isInteger(1) && "expected boolean expression on RHS");
-  return ValueBuilder<OrOp>(lhs, rhs);
-}
-
-static Value createIComparisonExpr(CmpIPredicate predicate, Value lhs,
-                                   Value rhs) {
-  auto lhsType = lhs.getType();
-  auto rhsType = rhs.getType();
-  (void)lhsType;
-  (void)rhsType;
-  assert(lhsType == rhsType && "cannot mix types in operators");
-  assert((lhsType.isa<IndexType>() || lhsType.isSignlessInteger()) &&
-         "only integer comparisons are supported");
-
-  return ScopedContext::getBuilderRef().create<CmpIOp>(
-      ScopedContext::getLocation(), predicate, lhs, rhs);
-}
-
-static Value createFComparisonExpr(CmpFPredicate predicate, Value lhs,
-                                   Value rhs) {
-  auto lhsType = lhs.getType();
-  auto rhsType = rhs.getType();
-  (void)lhsType;
-  (void)rhsType;
-  assert(lhsType == rhsType && "cannot mix types in operators");
-  assert(lhsType.isa<FloatType>() && "only float comparisons are supported");
-
-  return ScopedContext::getBuilderRef().create<CmpFOp>(
-      ScopedContext::getLocation(), predicate, lhs, rhs);
-}
-
-// All floating point comparison are ordered through EDSL
-Value mlir::edsc::op::eq(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OEQ, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::eq, lhs, rhs);
-}
-Value mlir::edsc::op::ne(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::ONE, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::ne, lhs, rhs);
-}
-Value mlir::edsc::op::slt(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OLT, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::slt, lhs, rhs);
-}
-Value mlir::edsc::op::sle(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OLE, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::sle, lhs, rhs);
-}
-Value mlir::edsc::op::sgt(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OGT, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::sgt, lhs, rhs);
-}
-Value mlir::edsc::op::sge(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OGE, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::sge, lhs, rhs);
-}
-Value mlir::edsc::op::ult(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OLT, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::ult, lhs, rhs);
-}
-Value mlir::edsc::op::ule(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OLE, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::ule, lhs, rhs);
-}
-Value mlir::edsc::op::ugt(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OGT, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::ugt, lhs, rhs);
-}
-Value mlir::edsc::op::uge(Value lhs, Value rhs) {
-  auto type = lhs.getType();
-  return type.isa<FloatType>()
-             ? createFComparisonExpr(CmpFPredicate::OGE, lhs, rhs)
-             : createIComparisonExpr(CmpIPredicate::uge, lhs, rhs);
-}

diff  --git a/mlir/lib/Dialect/Affine/EDSC/CMakeLists.txt b/mlir/lib/Dialect/Affine/EDSC/CMakeLists.txt
deleted file mode 100644
index e753f4e5c0fcc..0000000000000
--- a/mlir/lib/Dialect/Affine/EDSC/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-add_mlir_dialect_library(MLIRAffineEDSC
-  Builders.cpp
-
-  ADDITIONAL_HEADER_DIRS
-  ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Affine
-
-  DEPENDS
-  MLIRAffineOpsIncGen
-
-  LINK_LIBS PUBLIC
-  MLIRAffine
-  MLIREDSC
-  MLIRIR
-  MLIRLoopLikeInterface
-  MLIRSideEffectInterfaces
-  MLIRStandard
-  )

diff  --git a/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp b/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp
index c99084762a56c..1301be14e1fcd 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp
@@ -12,6 +12,7 @@
 #include "mlir/Dialect/Linalg/Passes.h"
 #include "mlir/Dialect/Linalg/Transforms/Transforms.h"
 #include "mlir/Dialect/Linalg/Utils/Utils.h"
+#include "mlir/Dialect/StandardOps/Utils/Utils.h"
 #include "mlir/IR/AffineExpr.h"
 #include "mlir/IR/AffineMap.h"
 #include "mlir/IR/BlockAndValueMapping.h"
@@ -24,41 +25,6 @@
 using namespace mlir;
 using namespace mlir::linalg;
 
-namespace {
-/// Helper struct to build simple arithmetic quantities with minimal type
-/// inference support.
-struct ArithBuilder {
-  ArithBuilder(OpBuilder &b, Location loc) : b(b), loc(loc) {}
-
-  Value select(Value cmp, Value lhs, Value rhs) {
-    return b.create<SelectOp>(loc, cmp, lhs, rhs);
-  }
-  Value slt(Value lhs, Value rhs) {
-    if (lhs.getType().isa<IntegerType>())
-      return b.create<CmpIOp>(loc, CmpIPredicate::slt, lhs, rhs);
-    return b.create<CmpFOp>(loc, CmpFPredicate::OLT, lhs, rhs);
-  }
-  Value sgt(Value lhs, Value rhs) {
-    if (lhs.getType().isa<IntegerType>())
-      return b.create<CmpIOp>(loc, CmpIPredicate::sgt, lhs, rhs);
-    return b.create<CmpFOp>(loc, CmpFPredicate::OGT, lhs, rhs);
-  }
-  Value add(Value lhs, Value rhs) {
-    if (lhs.getType().isa<IntegerType>())
-      return b.create<AddIOp>(loc, lhs, rhs);
-    return b.create<AddFOp>(loc, lhs, rhs);
-  }
-  Value mul(Value lhs, Value rhs) {
-    if (lhs.getType().isa<IntegerType>())
-      return b.create<MulIOp>(loc, lhs, rhs);
-    return b.create<MulFOp>(loc, lhs, rhs);
-  }
-
-  OpBuilder &b;
-  Location loc;
-};
-} // namespace
-
 static SmallVector<Value> makeCanonicalAffineApplies(OpBuilder &b, Location loc,
                                                      AffineMap map,
                                                      ArrayRef<Value> vals) {

diff  --git a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
index e350f1d7d98d3..dd40439d4c676 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
@@ -11,7 +11,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "PassDetail.h"
-#include "mlir/Dialect/Affine/EDSC/Intrinsics.h"
 #include "mlir/Dialect/Linalg/IR/LinalgTypes.h"
 #include "mlir/Dialect/Linalg/Passes.h"
 #include "mlir/Dialect/Linalg/Transforms/Transforms.h"

diff  --git a/mlir/lib/Dialect/Linalg/Utils/CMakeLists.txt b/mlir/lib/Dialect/Linalg/Utils/CMakeLists.txt
index 51e4f79077d91..b2b04ab865c7c 100644
--- a/mlir/lib/Dialect/Linalg/Utils/CMakeLists.txt
+++ b/mlir/lib/Dialect/Linalg/Utils/CMakeLists.txt
@@ -6,7 +6,6 @@ add_mlir_dialect_library(MLIRLinalgUtils
 
   LINK_LIBS PUBLIC
   MLIRAffine
-  MLIRAffineEDSC
   MLIRIR
   MLIRLinalg
   MLIRSCF

diff  --git a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
index bf8a6d0fe3e59..34cbdee09a498 100644
--- a/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Linalg/Utils/Utils.cpp
@@ -12,13 +12,13 @@
 
 #include "mlir/Dialect/Linalg/Utils/Utils.h"
 
-#include "mlir/Dialect/Affine/EDSC/Intrinsics.h"
 #include "mlir/Dialect/Affine/IR/AffineOps.h"
 #include "mlir/Dialect/Linalg/IR/LinalgOps.h"
 #include "mlir/Dialect/Linalg/IR/LinalgTypes.h"
 #include "mlir/Dialect/SCF/SCF.h"
 #include "mlir/Dialect/StandardOps/EDSC/Intrinsics.h"
 #include "mlir/Dialect/StandardOps/IR/Ops.h"
+#include "mlir/Dialect/StandardOps/Utils/Utils.h"
 #include "mlir/IR/AffineExpr.h"
 #include "mlir/IR/AffineExprVisitor.h"
 #include "mlir/IR/AffineMap.h"
@@ -311,10 +311,11 @@ void GenerateLoopNest<TiledLoopOp>::doit(
 void updateBoundsForCyclicDistribution(OpBuilder &b, Location loc, Value procId,
                                        Value nprocs, Value &lb, Value &ub,
                                        Value &step) {
-  using edsc::op::operator+;
-  using edsc::op::operator*;
-  lb = lb + (procId * step);
-  step = nprocs * step;
+  AffineExpr d0, d1;
+  bindDims(b.getContext(), d0, d1);
+  AffineExpr s0 = getAffineSymbolExpr(0, b.getContext());
+  lb = makeComposedAffineApply(b, loc, d0 + d1 * s0, {lb, procId, step});
+  step = makeComposedAffineApply(b, loc, d0 * s0, {nprocs, step});
 }
 
 /// Generates a loop nest consisting of scf.parallel and scf.for, depending
@@ -413,11 +414,10 @@ static void generateParallelLoopNest(
   }
   case DistributionMethod::CyclicNumProcsGeNumIters: {
     // Check (for the processed loops) that the iteration is in-bounds.
-    using edsc::op::slt;
-    using edsc::op::operator&&;
-    Value cond = slt(lbs[0], ubs[0]);
+    ArithBuilder ab(b, loc);
+    Value cond = ab.slt(lbs[0], ubs[0]);
     for (unsigned i = 1; i < numProcessed; ++i)
-      cond = cond && slt(lbs[i], ubs[i]);
+      cond = ab._and(cond, ab.slt(lbs[i], ubs[i]));
     ivStorage.append(lbs.begin(), std::next(lbs.begin(), numProcessed));
     b.create<scf::IfOp>(loc, cond, [&](OpBuilder &b, Location loc) {
       generateParallelLoopNest(
@@ -517,8 +517,6 @@ SmallVector<Value, 4> makeTiledShapes(OpBuilder &b, Location loc,
                            [](Value v) { return !isZero(v); })) &&
          "expected as many ivs as non-zero sizes");
 
-  using namespace edsc::op;
-
   // Construct (potentially temporary) mins and maxes on which to apply maps
   // that define tile subshapes.
   SmallVector<Value, 8> lbs, subShapeSizes;
@@ -529,7 +527,8 @@ SmallVector<Value, 4> makeTiledShapes(OpBuilder &b, Location loc,
                           : (Value)b.create<ConstantIndexOp>(loc, 0));
     // Before composing, we need to make range a closed interval.
     Value size = isTiled ? tileSizes[idx] : sizeBounds[idx];
-    subShapeSizes.push_back(size - b.create<ConstantIndexOp>(loc, 1));
+    AffineExpr d0 = getAffineDimExpr(0, b.getContext());
+    subShapeSizes.push_back(makeComposedAffineApply(b, loc, d0 - 1, size));
     LLVM_DEBUG(llvm::dbgs() << "lb: " << lbs.back() << "\n");
     LLVM_DEBUG(llvm::dbgs() << "size: " << subShapeSizes.back() << "\n");
   }
@@ -577,7 +576,8 @@ SmallVector<Value, 4> makeTiledShapes(OpBuilder &b, Location loc,
       offsets.push_back(offset);
       auto closedIntSize = applyMapToValues(b, loc, m, subShapeSizes).front();
       // Resulting size needs to be made half open interval again.
-      auto size = closedIntSize + b.create<ConstantIndexOp>(loc, 1);
+      AffineExpr s0 = getAffineSymbolExpr(0, b.getContext());
+      Value size = makeComposedAffineApply(b, loc, s0 + 1, closedIntSize);
       LLVM_DEBUG(llvm::dbgs() << "makeTiledShapes: raw size: " << size << "\n");
 
       // The size of the subview / subtensor should be trimmed to avoid

diff  --git a/mlir/lib/Dialect/StandardOps/Utils/Utils.cpp b/mlir/lib/Dialect/StandardOps/Utils/Utils.cpp
index 79614fd352d2f..30ef0937cda73 100644
--- a/mlir/lib/Dialect/StandardOps/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/StandardOps/Utils/Utils.cpp
@@ -48,3 +48,30 @@ void mlir::getPositionsOfShapeOne(
     }
   }
 }
+
+Value ArithBuilder::_and(Value lhs, Value rhs) {
+  return b.create<AndOp>(loc, lhs, rhs);
+}
+Value ArithBuilder::add(Value lhs, Value rhs) {
+  if (lhs.getType().isa<IntegerType>())
+    return b.create<AddIOp>(loc, lhs, rhs);
+  return b.create<AddFOp>(loc, lhs, rhs);
+}
+Value ArithBuilder::mul(Value lhs, Value rhs) {
+  if (lhs.getType().isa<IntegerType>())
+    return b.create<MulIOp>(loc, lhs, rhs);
+  return b.create<MulFOp>(loc, lhs, rhs);
+}
+Value ArithBuilder::sgt(Value lhs, Value rhs) {
+  if (lhs.getType().isa<IndexType, IntegerType>())
+    return b.create<CmpIOp>(loc, CmpIPredicate::sgt, lhs, rhs);
+  return b.create<CmpFOp>(loc, CmpFPredicate::OGT, lhs, rhs);
+}
+Value ArithBuilder::slt(Value lhs, Value rhs) {
+  if (lhs.getType().isa<IndexType, IntegerType>())
+    return b.create<CmpIOp>(loc, CmpIPredicate::slt, lhs, rhs);
+  return b.create<CmpFOp>(loc, CmpFPredicate::OLT, lhs, rhs);
+}
+Value ArithBuilder::select(Value cmp, Value lhs, Value rhs) {
+  return b.create<SelectOp>(loc, cmp, lhs, rhs);
+}

diff  --git a/mlir/test/Dialect/Linalg/tile-and-fuse-tensors.mlir b/mlir/test/Dialect/Linalg/tile-and-fuse-tensors.mlir
index 662349a978732..952652170356e 100644
--- a/mlir/test/Dialect/Linalg/tile-and-fuse-tensors.mlir
+++ b/mlir/test/Dialect/Linalg/tile-and-fuse-tensors.mlir
@@ -203,8 +203,6 @@ func @conv_tensors_dynamic(%input: tensor<?x?x?x?xf32>, %filter: tensor<?x?x?x?x
   return %for0 : tensor<?x?x?x?xf32>
 }
 
-// -----
-
 // CHECK: #[[BOUND8_MAP:.+]] = affine_map<(d0)[s0] -> (8, -d0 + s0)>
 // CHECK: #[[BOUND8_MAP_2:.+]] = affine_map<(d0)[s0, s1] -> (-d0 + s0, 8, -d0 + s1)>
 // CHECK: #[[BOUND8_MAP_3:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 8)>


        


More information about the Mlir-commits mailing list