|
22 | 22 | #include "clang/CIR/Dialect/IR/CIROpsDialect.cpp.inc"
|
23 | 23 | #include "clang/CIR/Dialect/IR/CIROpsEnums.cpp.inc"
|
24 | 24 | #include "clang/CIR/MissingFeatures.h"
|
| 25 | +#include <numeric> |
25 | 26 |
|
26 | 27 | using namespace mlir;
|
27 | 28 | using namespace cir;
|
@@ -962,6 +963,101 @@ bool cir::SwitchOp::isSimpleForm(llvm::SmallVectorImpl<CaseOp> &cases) {
|
962 | 963 | });
|
963 | 964 | }
|
964 | 965 |
|
| 966 | +//===----------------------------------------------------------------------===// |
| 967 | +// SwitchFlatOp |
| 968 | +//===----------------------------------------------------------------------===// |
| 969 | + |
| 970 | +void cir::SwitchFlatOp::build(OpBuilder &builder, OperationState &result, |
| 971 | + Value value, Block *defaultDestination, |
| 972 | + ValueRange defaultOperands, |
| 973 | + ArrayRef<APInt> caseValues, |
| 974 | + BlockRange caseDestinations, |
| 975 | + ArrayRef<ValueRange> caseOperands) { |
| 976 | + |
| 977 | + std::vector<mlir::Attribute> caseValuesAttrs; |
| 978 | + for (const APInt &val : caseValues) |
| 979 | + caseValuesAttrs.push_back(cir::IntAttr::get(value.getType(), val)); |
| 980 | + mlir::ArrayAttr attrs = ArrayAttr::get(builder.getContext(), caseValuesAttrs); |
| 981 | + |
| 982 | + build(builder, result, value, defaultOperands, caseOperands, attrs, |
| 983 | + defaultDestination, caseDestinations); |
| 984 | +} |
| 985 | + |
| 986 | +/// <cases> ::= `[` (case (`,` case )* )? `]` |
| 987 | +/// <case> ::= integer `:` bb-id (`(` ssa-use-and-type-list `)`)? |
| 988 | +static ParseResult parseSwitchFlatOpCases( |
| 989 | + OpAsmParser &parser, Type flagType, mlir::ArrayAttr &caseValues, |
| 990 | + SmallVectorImpl<Block *> &caseDestinations, |
| 991 | + SmallVectorImpl<llvm::SmallVector<OpAsmParser::UnresolvedOperand>> |
| 992 | + &caseOperands, |
| 993 | + SmallVectorImpl<llvm::SmallVector<Type>> &caseOperandTypes) { |
| 994 | + if (failed(parser.parseLSquare())) |
| 995 | + return failure(); |
| 996 | + if (succeeded(parser.parseOptionalRSquare())) |
| 997 | + return success(); |
| 998 | + llvm::SmallVector<mlir::Attribute> values; |
| 999 | + |
| 1000 | + auto parseCase = [&]() { |
| 1001 | + int64_t value = 0; |
| 1002 | + if (failed(parser.parseInteger(value))) |
| 1003 | + return failure(); |
| 1004 | + |
| 1005 | + values.push_back(cir::IntAttr::get(flagType, value)); |
| 1006 | + |
| 1007 | + Block *destination; |
| 1008 | + llvm::SmallVector<OpAsmParser::UnresolvedOperand> operands; |
| 1009 | + llvm::SmallVector<Type> operandTypes; |
| 1010 | + if (parser.parseColon() || parser.parseSuccessor(destination)) |
| 1011 | + return failure(); |
| 1012 | + if (!parser.parseOptionalLParen()) { |
| 1013 | + if (parser.parseOperandList(operands, OpAsmParser::Delimiter::None, |
| 1014 | + /*allowResultNumber=*/false) || |
| 1015 | + parser.parseColonTypeList(operandTypes) || parser.parseRParen()) |
| 1016 | + return failure(); |
| 1017 | + } |
| 1018 | + caseDestinations.push_back(destination); |
| 1019 | + caseOperands.emplace_back(operands); |
| 1020 | + caseOperandTypes.emplace_back(operandTypes); |
| 1021 | + return success(); |
| 1022 | + }; |
| 1023 | + if (failed(parser.parseCommaSeparatedList(parseCase))) |
| 1024 | + return failure(); |
| 1025 | + |
| 1026 | + caseValues = ArrayAttr::get(flagType.getContext(), values); |
| 1027 | + |
| 1028 | + return parser.parseRSquare(); |
| 1029 | +} |
| 1030 | + |
| 1031 | +static void printSwitchFlatOpCases(OpAsmPrinter &p, cir::SwitchFlatOp op, |
| 1032 | + Type flagType, mlir::ArrayAttr caseValues, |
| 1033 | + SuccessorRange caseDestinations, |
| 1034 | + OperandRangeRange caseOperands, |
| 1035 | + const TypeRangeRange &caseOperandTypes) { |
| 1036 | + p << '['; |
| 1037 | + p.printNewline(); |
| 1038 | + if (!caseValues) { |
| 1039 | + p << ']'; |
| 1040 | + return; |
| 1041 | + } |
| 1042 | + |
| 1043 | + size_t index = 0; |
| 1044 | + llvm::interleave( |
| 1045 | + llvm::zip(caseValues, caseDestinations), |
| 1046 | + [&](auto i) { |
| 1047 | + p << " "; |
| 1048 | + mlir::Attribute a = std::get<0>(i); |
| 1049 | + p << mlir::cast<cir::IntAttr>(a).getValue(); |
| 1050 | + p << ": "; |
| 1051 | + p.printSuccessorAndUseList(std::get<1>(i), caseOperands[index++]); |
| 1052 | + }, |
| 1053 | + [&] { |
| 1054 | + p << ','; |
| 1055 | + p.printNewline(); |
| 1056 | + }); |
| 1057 | + p.printNewline(); |
| 1058 | + p << ']'; |
| 1059 | +} |
| 1060 | + |
965 | 1061 | //===----------------------------------------------------------------------===//
|
966 | 1062 | // GlobalOp
|
967 | 1063 | //===----------------------------------------------------------------------===//
|
|
0 commit comments