| 936 | //===----------------------------------------------------------------------===// |
| 937 | |
| 938 | static ParseResult parseAssumePredicate(OpAsmParser &parser, |
| 939 | AssumePredicateAttrInterface &attr) { |
| 940 | SMLoc loc = parser.getCurrentLocation(); |
| 941 | |
| 942 | // Try parsing full attribute syntax first (#cuda_tile.div_by<...>) |
| 943 | Attribute parsedAttr; |
| 944 | auto parseResult = parser.parseOptionalAttribute(parsedAttr); |
| 945 | if (parseResult.has_value()) { |
| 946 | if (succeeded(*parseResult)) { |
| 947 | if (auto assumeAttr = |
| 948 | dyn_cast<AssumePredicateAttrInterface>(parsedAttr)) { |
| 949 | attr = assumeAttr; |
| 950 | return success(); |
| 951 | } |
| 952 | return parser.emitError(loc) << "expected assume predicate attribute"; |
| 953 | } |
| 954 | return *parseResult; |
| 955 | } |
| 956 | |
| 957 | // Try parsing shortened syntax (div_by<...> or same_elements<...>) |
| 958 | StringRef attrName; |
| 959 | if (failed(parser.parseKeyword(&attrName))) |
| 960 | return parser.emitError(loc) << "expected attribute name"; |
| 961 | |
| 962 | if (attrName == "div_by") { |
| 963 | // Reuse existing DivByAttr::parse method |
| 964 | if (auto parsedAttr = DivByAttr::parse(parser, Type{})) { |
| 965 | attr = static_cast<AssumePredicateAttrInterface>(parsedAttr); |
| 966 | return success(); |
| 967 | } |
| 968 | return failure(); |
| 969 | |
| 970 | } else if (attrName == "same_elements") { |
| 971 | // Reuse existing SameElementsAttr::parse method |
| 972 | if (auto parsedAttr = SameElementsAttr::parse(parser, Type{})) { |
| 973 | attr = static_cast<AssumePredicateAttrInterface>(parsedAttr); |
| 974 | return success(); |
| 975 | } |
| 976 | return failure(); |
| 977 | |
| 978 | } else if (attrName == "bounded") { |
| 979 | // Parse bounded predicate (no parameters needed) |
| 980 | if (auto parsedAttr = BoundedAttr::parse(parser, Type{})) { |
| 981 | attr = static_cast<AssumePredicateAttrInterface>(parsedAttr); |
| 982 | return success(); |
| 983 | } |
| 984 | return failure(); |
| 985 | |
| 986 | } else { |
| 987 | return parser.emitError(loc) |
| 988 | << "unknown assume predicate attribute: " << attrName |
| 989 | << " (expected 'div_by', 'same_elements', or 'bounded')"; |
| 990 | } |
| 991 | } |
| 992 | |
| 993 | static void printAssumePredicate(OpAsmPrinter &p, Operation *op, |
| 994 | AssumePredicateAttrInterface attr) { |