[Mlir-commits] [mlir] Add a polynomial dialect shell, attributes, and types (PR #72081)
Jeremy Kun
llvmlistbot at llvm.org
Fri Apr 12 14:54:28 PDT 2024
================
@@ -0,0 +1,222 @@
+//===- PolynomialAttributes.cpp - Polynomial dialect attrs ------*- 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
+//
+//===----------------------------------------------------------------------===//
+#include "mlir/Dialect/Polynomial/IR/PolynomialAttributes.h"
+
+#include "mlir/Dialect/Polynomial/IR/Polynomial.h"
+#include "mlir/Support/LLVM.h"
+#include "mlir/Support/LogicalResult.h"
+#include "llvm/ADT/SmallSet.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSet.h"
+
+namespace mlir {
+namespace polynomial {
+
+void PolynomialAttr::print(AsmPrinter &p) const {
+ p << '<';
+ p << getPolynomial();
+ p << '>';
+}
+
+/// Try to parse a monomial. If successful, populate the fields of the outparam
+/// `monomial` with the results, and the `variable` outparam with the parsed
+/// variable name. Sets shouldParseMore to true if the monomial is followed by
+/// a '+'.
+ParseResult parseMonomial(AsmParser &parser, Monomial &monomial,
+ llvm::StringRef &variable, bool *isConstantTerm,
+ bool *shouldParseMore) {
+ APInt parsedCoeff(apintBitWidth, 1);
+ auto parsedCoeffResult = parser.parseOptionalInteger(parsedCoeff);
+ monomial.coefficient = parsedCoeff;
+
+ *isConstantTerm = false;
+ *shouldParseMore = false;
+
+ // A + indicates it's a constant term with more to go, as in `1 + x`.
+ if (succeeded(parser.parseOptionalPlus())) {
+ // If no coefficient was parsed, and there's a +, then it's effectively
+ // parsing an empty string.
+ if (!parsedCoeffResult.has_value()) {
+ return failure();
+ }
+ monomial.exponent = APInt(apintBitWidth, 0);
+ *isConstantTerm = true;
+ *shouldParseMore = true;
+ return success();
+ }
+
+ // A monomial can be a trailing constant term, as in `x + 1`
+ if (failed(parser.parseOptionalKeyword(&variable))) {
+ // If neither a coefficient nor a variable was found, then it's effectively
+ // parsing an empty string.
+ if (!parsedCoeffResult.has_value()) {
+ return failure();
+ }
+
+ monomial.exponent = APInt(apintBitWidth, 0);
+ *isConstantTerm = true;
+ return success();
+ }
+
+ // Parse exponentiation symbol as **
+ // We can't use caret because it's reserved for basic block identifiers
+ // If no star is present, it's treated as a polynomial with exponent 1
+ if (succeeded(parser.parseOptionalStar())) {
+ // If there's one * there must be two
+ if (failed(parser.parseStar())) {
+ parser.emitError(parser.getCurrentLocation(),
+ "exponents must be specified as a double-asterisk `**`");
----------------
j2kun wrote:
Fixed in a1eb2b6e1ee
https://github.com/llvm/llvm-project/pull/72081
More information about the Mlir-commits
mailing list