33 auto isValueDefinedInside = [](mlir::Operation *ancestor, mlir::Value value) {
34 if (mlir::Operation *defOp = value.getDefiningOp()) {
35 return ancestor->isAncestor(defOp);
38 auto blockArg = llvm::dyn_cast<mlir::BlockArgument>(value);
39 mlir::Operation *parentOp = blockArg.getOwner()->getParentOp();
40 return parentOp && ancestor->isAncestor(parentOp);
43 for (mlir::Operation *parent = readOp->getParentOp(); parent; parent = parent->getParentOp()) {
44 if (!mlir::isa<mlir::scf::ForOp, mlir::scf::WhileOp>(parent) ||
45 isValueDefinedInside(parent, readOp.
getPodRef())) {
49 if (walkContainsMatch<WritePodOp>(*parent, [&readOp](
WritePodOp writeOp) {
64 mlir::ValueRange values, mlir::TypeRange expectedTypes,
65 llvm::SmallVectorImpl<mlir::Value> &output
67 if (values.size() != expectedTypes.size()) {
71 llvm::SmallVector<mlir::Value> stagedValues;
72 stagedValues.reserve(values.size());
73 for (
auto [value, expectedType] : llvm::zip_equal(values, expectedTypes)) {
74 if (value.getType() != expectedType) {
77 stagedValues.push_back(value);
80 llvm::append_range(output, stagedValues);
bool appendValuesWithExactTypes(mlir::ValueRange values, mlir::TypeRange expectedTypes, llvm::SmallVectorImpl< mlir::Value > &output)
Append values only when every entry exactly matches the corresponding expected type.