[Mlir-commits] [mlir] 76ad74a - Address more comments.
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Dec 2 13:59:17 PST 2021
Author: Groverkss
Date: 2021-12-03T03:23:21+05:30
New Revision: 76ad74a4a9014e806a514bca31b33b262b41386e
URL: https://github.com/llvm/llvm-project/commit/76ad74a4a9014e806a514bca31b33b262b41386e
DIFF: https://github.com/llvm/llvm-project/commit/76ad74a4a9014e806a514bca31b33b262b41386e.diff
LOG: Address more comments.
Added:
Modified:
mlir/include/mlir/Analysis/AffineStructures.h
mlir/lib/Analysis/AffineStructures.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Analysis/AffineStructures.h b/mlir/include/mlir/Analysis/AffineStructures.h
index a06f790a1afb..a9bc382e0cb8 100644
--- a/mlir/include/mlir/Analysis/AffineStructures.h
+++ b/mlir/include/mlir/Analysis/AffineStructures.h
@@ -441,9 +441,13 @@ class FlatAffineConstraints {
/// variables.
void convertDimToLocal(unsigned dimStart, unsigned dimLimit);
- /// Merges and aligns local ids of `this` and `other`. Local ids with
- /// identical division representations are merged. The number of dimensions
- /// and symbol ids in `this` and `other` should match.
+ /// Adds additional local ids to the sets such that they both have the union
+ /// of the local ids in each set, without changing the set of points that
+ /// lie in `this` and `other`. The ordering of the local ids in the
+ /// sets may also be changed but is the same in both sets.
+ ///
+ /// The number of dimensions and symbol ids in `this` and `other` should
+ /// match.
void mergeLocalIds(FlatAffineConstraints &other);
/// Removes all equalities and inequalities.
@@ -818,8 +822,8 @@ class FlatAffineValueConstraints : public FlatAffineConstraints {
/// constraint systems are updated so that they have the union of all
/// identifiers, with `this`'s original identifiers appearing first followed
/// by any of `other`'s identifiers that didn't appear in `this`. Local
- /// identifiers of each system are by design separate/local and are placed
- /// one after other (`this`'s followed by `other`'s).
+ /// identifiers are also aligned but may not follow ordering as
+ /// dimension/symbol ids do.
// E.g.: Input: `this` has (%i, %j) [%M, %N]
// `other` has (%k, %j) [%P, %N, %M]
// Output: both `this`, `other` have (%i, %j, %k) [%M, %N, %P]
diff --git a/mlir/lib/Analysis/AffineStructures.cpp b/mlir/lib/Analysis/AffineStructures.cpp
index 4ed33de474c4..dbbe7864ac06 100644
--- a/mlir/lib/Analysis/AffineStructures.cpp
+++ b/mlir/lib/Analysis/AffineStructures.cpp
@@ -493,8 +493,8 @@ static bool LLVM_ATTRIBUTE_UNUSED areIdsUnique(
/// dimension-wise and symbol-wise unique; both constraint systems are updated
/// so that they have the union of all identifiers, with A's original
/// identifiers appearing first followed by any of B's identifiers that didn't
-/// appear in A. Local identifiers of each system are by design separate/local
-/// and are placed one after other (A's followed by B's).
+/// appear in A. Local identifiers are also aligned but may not follow ordering
+/// as dimension/symbol ids do.
// E.g.: Input: A has ((%i, %j) [%M, %N]) and B has (%k, %j) [%P, %N, %M])
// Output: both A, B have (%i, %j, %k) [%M, %N, %P]
static void mergeAndAlignIds(unsigned offset, FlatAffineValueConstraints *a,
@@ -1938,6 +1938,16 @@ static void eliminateRedundantLocalId(FlatAffineConstraints &fac, unsigned pos1,
fac.removeId(pos2);
}
+/// Adds additional local ids to the sets such that they both have the union
+/// of the local ids in each set, without changing the set of points that
+/// lie in `this` and `other`.
+///
+/// To detect local ids that always take the same in both sets, each local id is
+/// represented as a floordiv with constant denominator in terms of other ids.
+/// After extracting these divisions, local ids with the same division
+/// representation are considered duplicate and are merged. It is possible that
+/// division representation for some local id cannot be obtained, and thus these
+/// local ids are not considered for detecting duplicates.
void FlatAffineConstraints::mergeLocalIds(FlatAffineConstraints &other) {
assert(getNumDimIds() == other.getNumDimIds() &&
"Number of dimension ids should match");
@@ -1947,32 +1957,26 @@ void FlatAffineConstraints::mergeLocalIds(FlatAffineConstraints &other) {
FlatAffineConstraints &fac1 = *this;
FlatAffineConstraints &fac2 = other;
+ // Merge local ids of fac1 and fac2 without using division information,
+ // i.e. append local ids of `fac2` to `fac1` and insert local ids of `fac1`
+ // to `fac2` at start of its local ids.
+ unsigned initLocals = fac1.getNumLocalIds();
+ insertLocalId(fac1.getNumLocalIds(), fac2.getNumLocalIds());
+ fac2.insertLocalId(0, initLocals);
+
// Get division representations from each FAC.
std::vector<SmallVector<int64_t, 8>> divs1, divs2;
SmallVector<unsigned, 4> denoms1, denoms2;
fac1.getLocalReprs(divs1, denoms1);
fac2.getLocalReprs(divs2, denoms2);
- // Merge local ids of fac1 and fac2 without using division information,
- // i.e. append local ids of `fac2` to `fac1` and insert local ids of `fac1`
- // to `fac2` at start of its local ids. Also, insert these local ids in
+ // Copy division information from fac2 to fac1. Since newly added local
+ // variables in fac1 and fac2 have no constraints, they will not have any
// division representation.
- unsigned initLocals = fac1.getNumLocalIds();
- for (unsigned i = 0, e = divs1.size(); i < e; ++i)
- if (denoms1[i] != 0)
- divs1[i].insert(divs1[i].begin() + fac1.getNumIds(),
- fac2.getNumLocalIds(), 0);
- insertLocalId(fac1.getNumLocalIds(), fac2.getNumLocalIds());
-
- for (unsigned i = 0, e = divs2.size(); i < e; ++i)
- if (denoms2[i] != 0)
- divs2[i].insert(divs2[i].begin() + fac2.getIdKindOffset(IdKind::Local),
- initLocals, 0);
- fac2.insertLocalId(0, initLocals);
-
- // Merge division representations extracted from fac1 and fac2.
- divs1.insert(divs1.end(), divs2.begin(), divs2.end());
- denoms1.insert(denoms1.end(), denoms2.begin(), denoms2.end());
+ std::copy(divs2.begin() + initLocals, divs2.end(),
+ divs1.begin() + initLocals);
+ std::copy(denoms2.begin() + initLocals, denoms2.end(),
+ denoms1.begin() + initLocals);
// Find and merge duplicate divisions.
// TODO: Add division normalization to support divisions that
diff er by
More information about the Mlir-commits
mailing list