diff --git a/mlir/lib/Dialect/Arith/Transforms/IntNarrowing.cpp b/mlir/lib/Dialect/Arith/Transforms/IntNarrowing.cpp --- a/mlir/lib/Dialect/Arith/Transforms/IntNarrowing.cpp +++ b/mlir/lib/Dialect/Arith/Transforms/IntNarrowing.cpp @@ -748,6 +748,12 @@ using ArithIntNarrowingBase::ArithIntNarrowingBase; void runOnOperation() override { + if (bitwidthsSupported.empty() || + llvm::is_contained(bitwidthsSupported, 0)) { + // Invalid pass options. + return signalPassFailure(); + } + Operation *op = getOperation(); MLIRContext *ctx = op->getContext(); RewritePatternSet patterns(ctx); diff --git a/mlir/test/Dialect/Arith/int-narrowing-invalid-options.mlir b/mlir/test/Dialect/Arith/int-narrowing-invalid-options.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Dialect/Arith/int-narrowing-invalid-options.mlir @@ -0,0 +1,16 @@ +// RUN: not mlir-opt %s --arith-int-narrowing --mlir-print-ir-after-failure 2>&1 \ +// RUN: | FileCheck %s + +// RUN: not mlir-opt %s --arith-int-narrowing="int-bitwidths-supported=0" \ +// RUN: --mlir-print-ir-after-failure 2>&1 | FileCheck %s + +// Make sure we do not crash on invalid pass options. + +// CHECK: IR Dump After ArithIntNarrowing Failed (arith-int-narrowing) +// CHECK-LABEL: func.func @addi_extsi_i8 +func.func @addi_extsi_i8(%lhs: i8, %rhs: i8) -> i32 { + %a = arith.extsi %lhs : i8 to i32 + %b = arith.extsi %rhs : i8 to i32 + %r = arith.addi %a, %b : i32 + return %r : i32 +}