From: Oleg Shyshkov Date: Thu, 27 Oct 2022 11:32:52 +0000 (+0200) Subject: [mlir] Fix `AffineMap.dropResults`. X-Git-Tag: upstream/17.0.6~29337 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7ab21cdc208491c5f935b9fbc18c3436a6e14c1f;p=platform%2Fupstream%2Fllvm.git [mlir] Fix `AffineMap.dropResults`. `AffineMap.dropResult` erases one result from the array and it changes indexing. Calling `dropResult` is a loop with increasing indexes does not produce a desired result. Differential Revision: https://reviews.llvm.org/D136833 --- diff --git a/mlir/include/mlir/IR/AffineMap.h b/mlir/include/mlir/IR/AffineMap.h index 0c1d6bd..ccd167d 100644 --- a/mlir/include/mlir/IR/AffineMap.h +++ b/mlir/include/mlir/IR/AffineMap.h @@ -243,19 +243,18 @@ public: /// Returns a new AffineMap with the same number of dims and symbols and one /// less result at `pos`, dropped. - AffineMap dropResult(int64_t pos) { - auto exprs = llvm::to_vector<4>(getResults()); - exprs.erase(exprs.begin() + pos); - return AffineMap::get(getNumDims(), getNumSymbols(), exprs, getContext()); - } + AffineMap dropResult(int64_t pos) { return dropResults({pos}); } // Returns a new AffineMap with the same number of dims and symbols, but all // positions in `positions` dropped from results. AffineMap dropResults(ArrayRef positions) { - AffineMap resultMap = *this; - for (int64_t pos : positions) - resultMap = resultMap.dropResult(pos); - return resultMap; + SmallVector reverse_sorted_positions = llvm::to_vector(positions); + llvm::sort(reverse_sorted_positions, std::greater()); + + auto exprs = llvm::to_vector<4>(getResults()); + for (int64_t pos : reverse_sorted_positions) + exprs.erase(exprs.begin() + pos); + return AffineMap::get(getNumDims(), getNumSymbols(), exprs, getContext()); } /// Returns a new AffineMap with the same number of dims and symbols and an