let convertFromStorage = "$_self";
}
-def ElementsAttr: ElementsAttrBase<CPred<"$_self.isa<ElementsAttr>()">,
+def ElementsAttr : ElementsAttrBase<CPred<"$_self.isa<ElementsAttr>()">,
"constant vector/tensor attribute">;
+class IntElementsAttr<int width> : ElementsAttrBase<
+ CPred<"$_self.isa<DenseIntElementsAttr>() &&"
+ "$_self.cast<DenseIntElementsAttr>().getType()."
+ "getElementType().isInteger(" # width # ")">,
+ width # "-bit integer elements attribute"> {
+
+ let storageType = [{ DenseIntElementsAttr }];
+ let returnType = [{ DenseIntElementsAttr }];
+
+ // Note that this is only constructing scalar elements attribute.
+ let constBuilderCall = "DenseElementsAttr::get("
+ "$_builder.getTensorType({}, $_builder.getIntegerType(" # width # ")), "
+ "llvm::makeArrayRef($0)).cast<DenseIntElementsAttr>()";
+ let convertFromStorage = "$_self";
+}
+
+def I32ElementsAttr : IntElementsAttr<32>;
+def I64ElementsAttr : IntElementsAttr<64>;
+
// Base class for array attributes.
class ArrayAttrBase<Pred condition, string description> :
Attr<condition, description> {
let constBuilderCall = ?;
}
-def I32ElementsAttr : Attr<
- CPred<"$_self.isa<DenseIntElementsAttr>() &&"
- "$_self.cast<DenseIntElementsAttr>().getType()."
- "getElementType().isInteger(32)">,
- "32-bit integer elements attribute"> {
- let storageType = [{ DenseIntElementsAttr }];
- let returnType = [{ DenseIntElementsAttr }];
- let constBuilderCall = "$_builder.getDenseElementsAttr("
- "$_builder.getTensorType({}, $_builder.getIntegerType(32)), "
- "{$_builder.getI32IntegerAttr($0)})";
- let convertFromStorage = "$_self";
-}
// Attribute information for an Attribute field within a StructAttr.
class StructFieldAttr<string thisName, Attr thisType> {
// Name of this field in the StructAttr.
let regions = (region SizedRegion<1>:$region);
}
-def I32ElementsAttributesOp : TEST_Op<"i32ElementsAttr"> {
+def I32ElementsAttrOp : TEST_Op<"i32ElementsAttr"> {
let arguments = (ins I32ElementsAttr:$attr);
}
+def IsNotScalar : Constraint<CPred<"$0.getType().getRank() != 0">>;
+
+def UpdateAttr : Pat<(I32ElementsAttrOp $attr),
+ (I32ElementsAttrOp ConstantAttr<I32ElementsAttr, "0">),
+ [(IsNotScalar $attr)]>;
+
//===----------------------------------------------------------------------===//
// Test Patterns
//===----------------------------------------------------------------------===//
return %0 : i32
}
+//===----------------------------------------------------------------------===//
+// Test ElelementsAttr
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: rewrite_i32elementsattr
+func @rewrite_i32elementsattr() -> () {
+ // CHECK: attr = dense<0> : tensor<i32>
+ "test.i32ElementsAttr"() {attr = dense<[3, 5]>:tensor<2xi32>} : () -> ()
+ return
+}
+
//===----------------------------------------------------------------------===//
// Test Multi-result Ops
//===----------------------------------------------------------------------===//