return success();
}
+OpFoldResult BroadcastOp::fold(ArrayRef<Attribute> operands) {
+ if (!operands[0])
+ return {};
+ auto vectorType = getVectorType();
+ if (operands[0].getType().isIntOrIndexOrFloat())
+ return DenseElementsAttr::get(vectorType, operands[0]);
+ if (auto attr = operands[0].dyn_cast<SplatElementsAttr>())
+ return DenseElementsAttr::get(vectorType, attr.getSplatValue());
+ return {};
+}
+
//===----------------------------------------------------------------------===//
// ShuffleOp
//===----------------------------------------------------------------------===//
}
// CHECK-LABEL:func @matmul
-// CHECK: vector.broadcast {{.*}} : f32 to vector<8x16xf32>
// CHECK: store {{.*}}[] : memref<vector<8x16xf32>>
-//
-// CHECK: vector.broadcast {{.*}} : f32 to vector<16x12xf32>
// CHECK: store {{.*}}[] : memref<vector<16x12xf32>>
-//
-// CHECK: vector.broadcast {{.*}} : f32 to vector<8x12xf32>
// CHECK: store {{.*}}[] : memref<vector<8x12xf32>>
//
// CHECK: linalg.copy
%2 = vector.bitcast %1 : vector<4xi16> to vector<2xi32>
return %0, %2 : vector<4x8xf32>, vector<2xi32>
}
+
+// -----
+
+// CHECK-LABEL: broadcast_folding1
+// CHECK: %[[CST:.*]] = constant dense<42> : vector<4xi32>
+// CHECK-NOT: vector.broadcast
+// CHECK: return %[[CST]]
+func @broadcast_folding1() -> vector<4xi32> {
+ %0 = constant 42 : i32
+ %1 = vector.broadcast %0 : i32 to vector<4xi32>
+ return %1 : vector<4xi32>
+}
+
+// -----
+
+// CHECK-LABEL: @broadcast_folding2
+// CHECK: %[[CST:.*]] = constant dense<42> : vector<4x16xi32>
+// CHECK-NOT: vector.broadcast
+// CHECK: return %[[CST]]
+func @broadcast_folding2() -> vector<4x16xi32> {
+ %0 = constant 42 : i32
+ %1 = vector.broadcast %0 : i32 to vector<16xi32>
+ %2 = vector.broadcast %1 : vector<16xi32> to vector<4x16xi32>
+ return %2 : vector<4x16xi32>
+}