Author: River Riddle Date: 2020-12-10T12:40:10-08:00 New Revision: 1f5f006d9d53e785296d1a8fbb0e90904a5eaf60
URL: https://github.com/llvm/llvm-project/commit/1f5f006d9d53e785296d1a8fbb0e90904a5eaf60 DIFF: https://github.com/llvm/llvm-project/commit/1f5f006d9d53e785296d1a8fbb0e90904a5eaf60.diff LOG: [mlir][StandardOps] Verify that the result of an integer constant is signless This was missed when supported for unsigned/signed integer types was first added, and results in crashes if a user tries to create/print a constant with the incorrect integer type. Fixes PR#46222 Differential Revision: https://reviews.llvm.org/D92981 Added: Modified: mlir/lib/Dialect/StandardOps/IR/Ops.cpp mlir/test/Dialect/Standard/invalid.mlir Removed: ################################################################################ diff --git a/mlir/lib/Dialect/StandardOps/IR/Ops.cpp b/mlir/lib/Dialect/StandardOps/IR/Ops.cpp index 34c3da9b5eca..0efba0d9d4d8 100644 --- a/mlir/lib/Dialect/StandardOps/IR/Ops.cpp +++ b/mlir/lib/Dialect/StandardOps/IR/Ops.cpp @@ -1136,7 +1136,7 @@ static LogicalResult verify(ConstantOp &op) { if (!value) return op.emitOpError("requires a 'value' attribute"); - auto type = op.getType(); + Type type = op.getType(); if (!value.getType().isa<NoneType>() && type != value.getType()) return op.emitOpError() << "requires attribute's type (" << value.getType() << ") to match op's return type (" << type << ")"; @@ -1145,10 +1145,14 @@ static LogicalResult verify(ConstantOp &op) { return success(); if (auto intAttr = value.dyn_cast<IntegerAttr>()) { + IntegerType intType = type.cast<IntegerType>(); + if (!intType.isSignless()) + return op.emitOpError("requires integer result types to be signless"); + // If the type has a known bitwidth we verify that the value can be // represented with the given bitwidth. - auto bitwidth = type.cast<IntegerType>().getWidth(); - auto intVal = intAttr.getValue(); + unsigned bitwidth = intType.getWidth(); + APInt intVal = intAttr.getValue(); if (!intVal.isSignedIntN(bitwidth) && !intVal.isIntN(bitwidth)) return op.emitOpError("requires 'value' to be an integer within the " "range of the integer result type"); @@ -1228,9 +1232,13 @@ bool ConstantOp::isBuildableWith(Attribute value, Type type) { // SymbolRefAttr can only be used with a function type. if (value.isa<SymbolRefAttr>()) return type.isa<FunctionType>(); - // Otherwise, the attribute must have the same type as 'type'. + // The attribute must have the same type as 'type'. if (value.getType() != type) return false; + // If the type is an integer type, it must be signless. + if (IntegerType integerTy = type.dyn_cast<IntegerType>()) + if (!integerTy.isSignless()) + return false; // Finally, check that the attribute kind is handled. return value.isa<IntegerAttr, FloatAttr, ElementsAttr, UnitAttr>(); } diff --git a/mlir/test/Dialect/Standard/invalid.mlir b/mlir/test/Dialect/Standard/invalid.mlir index 04ecdc64351a..48d2ae23466c 100644 --- a/mlir/test/Dialect/Standard/invalid.mlir +++ b/mlir/test/Dialect/Standard/invalid.mlir @@ -298,3 +298,18 @@ func @mismatched_types() { return } +// ----- + +func @non_signless_constant() { + // expected-error @+1 {{requires integer result types to be signless}} + %0 = constant 0 : ui32 + return +} + +// ----- + +func @non_signless_constant() { + // expected-error @+1 {{requires integer result types to be signless}} + %0 = constant 0 : si32 + return +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits