diff --git a/mlir/include/mlir/IR/OpImplementation.h b/mlir/include/mlir/IR/OpImplementation.h --- a/mlir/include/mlir/IR/OpImplementation.h +++ b/mlir/include/mlir/IR/OpImplementation.h @@ -1032,8 +1032,14 @@ /// Parse an affine map instance into 'map'. virtual ParseResult parseAffineMap(AffineMap &map) = 0; + /// Parse an affine expr instance into 'expr' using the already computed + /// mapping from symbols to affine expressions in 'symbolSet'. + virtual ParseResult + parseAffineExpr(SmallVectorImpl> &symbolSet, + AffineExpr &expr) = 0; + /// Parse an integer set instance into 'set'. - virtual ParseResult printIntegerSet(IntegerSet &set) = 0; + virtual ParseResult parseIntegerSet(IntegerSet &set) = 0; //===--------------------------------------------------------------------===// // Identifier Parsing diff --git a/mlir/lib/AsmParser/AffineParser.cpp b/mlir/lib/AsmParser/AffineParser.cpp --- a/mlir/lib/AsmParser/AffineParser.cpp +++ b/mlir/lib/AsmParser/AffineParser.cpp @@ -53,13 +53,14 @@ ParseResult parseAffineMapRange(unsigned numDims, unsigned numSymbols, AffineMap &result); ParseResult parseAffineMapOrIntegerSetInline(AffineMap &map, IntegerSet &set); + ParseResult parseAffineExprInline( + SmallVectorImpl> &symbolSet, + AffineExpr &expr); ParseResult parseIntegerSetConstraints(unsigned numDims, unsigned numSymbols, IntegerSet &result); ParseResult parseAffineMapOfSSAIds(AffineMap &map, OpAsmParser::Delimiter delimiter); ParseResult parseAffineExprOfSSAIds(AffineExpr &expr); - void getDimsAndSymbolSSAIds(SmallVectorImpl &dimAndSymbolSSAIds, - unsigned &numDims); private: // Binary affine op parsing. @@ -535,6 +536,15 @@ return parseIntegerSetConstraints(numDims, numSymbols, set); } +/// Parses an affine expresion definition inline, with given synbols. +ParseResult AffineParser::parseAffineExprInline( + SmallVectorImpl> &symbolSet, + AffineExpr &expr) { + dimsAndSymbols.assign(symbolSet); + expr = parseAffineExpr(); + return success(expr != nullptr); +} + /// Parse an AffineMap where the dim and symbol identifiers are SSA ids. ParseResult AffineParser::parseAffineMapOfSSAIds(AffineMap &map, @@ -705,6 +715,11 @@ return emitError(curLoc, "expected AffineMap, but got IntegerSet"); return success(); } +ParseResult Parser::parseAffineExprReference( + SmallVectorImpl> &symbolSet, + AffineExpr &expr) { + return AffineParser(state).parseAffineExprInline(symbolSet, expr); +} ParseResult Parser::parseIntegerSetReference(IntegerSet &set) { SMLoc curLoc = getToken().getLoc(); AffineMap map; diff --git a/mlir/lib/AsmParser/AsmParserImpl.h b/mlir/lib/AsmParser/AsmParserImpl.h --- a/mlir/lib/AsmParser/AsmParserImpl.h +++ b/mlir/lib/AsmParser/AsmParserImpl.h @@ -456,8 +456,16 @@ return parser.parseAffineMapReference(map); } + /// Parse an affine expr instance into 'expr' using the already computed + /// mapping from symbols to affine expressions in 'symbolSet'. + ParseResult + parseAffineExpr(SmallVectorImpl> &symbolSet, + AffineExpr &expr) { + return parser.parseAffineExprReference(symbolSet, expr); + } + /// Parse an integer set instance into 'set'. - ParseResult printIntegerSet(IntegerSet &set) override { + ParseResult parseIntegerSet(IntegerSet &set) override { return parser.parseIntegerSetReference(set); } diff --git a/mlir/lib/AsmParser/Parser.h b/mlir/lib/AsmParser/Parser.h --- a/mlir/lib/AsmParser/Parser.h +++ b/mlir/lib/AsmParser/Parser.h @@ -296,10 +296,13 @@ // Affine Parsing //===--------------------------------------------------------------------===// - /// Parse a reference to either an affine map, or an integer set. + /// Parse a reference to either an affine map, expr, or an integer set. ParseResult parseAffineMapOrIntegerSetReference(AffineMap &map, IntegerSet &set); ParseResult parseAffineMapReference(AffineMap &map); + ParseResult parseAffineExprReference( + SmallVectorImpl> &symbolSet, + AffineExpr &expr); ParseResult parseIntegerSetReference(IntegerSet &set); /// Parse an AffineMap where the dim and symbol identifiers are SSA ids.