[Mlir-commits] [mlir] 2e17ffb - [mlir][LLVM] Improve error handling in switch parsing
Christian Ulmann
llvmlistbot at llvm.org
Tue Jun 27 02:02:29 PDT 2023
Author: Christian Ulmann
Date: 2023-06-27T09:01:59Z
New Revision: 2e17ffb469e97d7cf8d2f4a093d34afd698ac19f
URL: https://github.com/llvm/llvm-project/commit/2e17ffb469e97d7cf8d2f4a093d34afd698ac19f
DIFF: https://github.com/llvm/llvm-project/commit/2e17ffb469e97d7cf8d2f4a093d34afd698ac19f.diff
LOG: [mlir][LLVM] Improve error handling in switch parsing
This commit changes the 'llvm.switch' parsing to not silently fail when
it encounters superfluous commas in the case list.
Reviewed By: gysit
Differential Revision: https://reviews.llvm.org/D153841
Added:
Modified:
mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
mlir/test/Dialect/LLVMIR/invalid.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 62d338b051c64..e74ec53fe3eeb 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -952,8 +952,8 @@ def LLVM_SwitchOp : LLVM_TerminatorOp<"switch",
let assemblyFormat = [{
$value `:` type($value) `,`
$defaultDestination (`(` $defaultOperands^ `:` type($defaultOperands) `)`)?
- `[` `\n` custom<SwitchOpCases>(ref(type($value)), $case_values, $caseDestinations,
- $caseOperands, type($caseOperands)) `]`
+ custom<SwitchOpCases>(ref(type($value)), $case_values, $caseDestinations,
+ $caseOperands, type($caseOperands))
attr-dict
}];
let hasVerifier = 1;
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 23c7515e6bfd4..186af5fbf5fa4 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -399,22 +399,22 @@ void SwitchOp::build(OpBuilder &builder, OperationState &result, Value value,
caseValuesAttr, caseDestinations, caseOperands, branchWeights);
}
-/// <cases> ::= integer `:` bb-id (`(` ssa-use-and-type-list `)`)?
-/// ( `,` integer `:` bb-id (`(` ssa-use-and-type-list `)`)? )?
+/// <cases> ::= `[` (case (`,` case )* )? `]`
+/// <case> ::= integer `:` bb-id (`(` ssa-use-and-type-list `)`)?
static ParseResult parseSwitchOpCases(
OpAsmParser &parser, Type flagType, DenseIntElementsAttr &caseValues,
SmallVectorImpl<Block *> &caseDestinations,
SmallVectorImpl<SmallVector<OpAsmParser::UnresolvedOperand>> &caseOperands,
SmallVectorImpl<SmallVector<Type>> &caseOperandTypes) {
+ if (failed(parser.parseLSquare()))
+ return failure();
+ if (succeeded(parser.parseOptionalRSquare()))
+ return success();
SmallVector<APInt> values;
unsigned bitWidth = flagType.getIntOrFloatBitWidth();
- do {
+ auto parseCase = [&]() {
int64_t value = 0;
- OptionalParseResult integerParseResult = parser.parseOptionalInteger(value);
- if (values.empty() && !integerParseResult.has_value())
- return success();
-
- if (!integerParseResult.has_value() || integerParseResult.value())
+ if (failed(parser.parseInteger(value)))
return failure();
values.push_back(APInt(bitWidth, value));
@@ -432,12 +432,15 @@ static ParseResult parseSwitchOpCases(
caseDestinations.push_back(destination);
caseOperands.emplace_back(operands);
caseOperandTypes.emplace_back(operandTypes);
- } while (!parser.parseOptionalComma());
+ return success();
+ };
+ if (failed(parser.parseCommaSeparatedList(parseCase)))
+ return failure();
ShapedType caseValueType =
VectorType::get(static_cast<int64_t>(values.size()), flagType);
caseValues = DenseIntElementsAttr::get(caseValueType, values);
- return success();
+ return parser.parseRSquare();
}
static void printSwitchOpCases(OpAsmPrinter &p, SwitchOp op, Type flagType,
@@ -445,8 +448,12 @@ static void printSwitchOpCases(OpAsmPrinter &p, SwitchOp op, Type flagType,
SuccessorRange caseDestinations,
OperandRangeRange caseOperands,
const TypeRangeRange &caseOperandTypes) {
- if (!caseValues)
+ p << '[';
+ p.printNewline();
+ if (!caseValues) {
+ p << ']';
return;
+ }
size_t index = 0;
llvm::interleave(
@@ -462,6 +469,7 @@ static void printSwitchOpCases(OpAsmPrinter &p, SwitchOp op, Type flagType,
p.printNewline();
});
p.printNewline();
+ p << ']';
}
LogicalResult SwitchOp::verify() {
diff --git a/mlir/test/Dialect/LLVMIR/invalid.mlir b/mlir/test/Dialect/LLVMIR/invalid.mlir
index e8a297c9fde1c..57e02427dc4ba 100644
--- a/mlir/test/Dialect/LLVMIR/invalid.mlir
+++ b/mlir/test/Dialect/LLVMIR/invalid.mlir
@@ -857,6 +857,19 @@ module attributes {llvm.data_layout = "#vjkr32"} {
// -----
+func.func @switch_superfluous_comma(%arg0 : i64) {
+ // expected-error at +3 {{custom op 'llvm.switch' expected integer value}}
+ llvm.switch %arg0 : i32, ^bb1 [
+ 42: ^bb2,
+ ]
+^bb1:
+ llvm.return
+^bb2:
+ llvm.return
+}
+
+// -----
+
func.func @switch_wrong_number_of_weights(%arg0 : i32) {
// expected-error at +1 {{expects number of branch weights to match number of successors: 3 vs 2}}
llvm.switch %arg0 : i32, ^bb1 [
More information about the Mlir-commits
mailing list