[llvm-branch-commits] [mlir] 1f5f006 - [mlir][StandardOps] Verify that the result of an integer constant is signless
River Riddle via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Dec 10 12:45:50 PST 2020
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
+}
More information about the llvm-branch-commits
mailing list