#include "mlir/Analysis/BufferViewFlowAnalysis.h"
+#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Interfaces/ControlFlowInterfaces.h"
#include "mlir/Interfaces/ViewLikeInterface.h"
#include "llvm/ADT/SetOperations.h"
/// successor regions and branch-like return operations from nested regions.
void BufferViewFlowAnalysis::build(Operation *op) {
// Registers all dependencies of the given values.
- auto registerDependencies = [&](auto values, auto dependencies) {
- for (auto entry : llvm::zip(values, dependencies))
- this->dependencies[std::get<0>(entry)].insert(std::get<1>(entry));
+ auto registerDependencies = [&](ValueRange values, ValueRange dependencies) {
+ for (auto [value, dep] : llvm::zip(values, dependencies))
+ this->dependencies[value].insert(dep);
};
// Add additional dependencies created by view changes to the alias list.
}
}
});
+
+ // TODO: This should be an interface.
+ op->walk([&](arith::SelectOp selectOp) {
+ registerDependencies({selectOp.getOperand(1)}, {selectOp.getResult()});
+ registerDependencies({selectOp.getOperand(2)}, {selectOp.getResult()});
+ });
}
// CHECK-NEXT: return
return
}
+
+// -----
+
+func.func @select_aliases(%arg0: index, %arg1: memref<?xi8>, %arg2: i1) {
+ // CHECK: memref.alloc
+ // CHECK: memref.alloc
+ // CHECK: arith.select
+ // CHECK: test.copy
+ // CHECK: memref.dealloc
+ // CHECK: memref.dealloc
+ %0 = memref.alloc(%arg0) : memref<?xi8>
+ %1 = memref.alloc(%arg0) : memref<?xi8>
+ %2 = arith.select %arg2, %0, %1 : memref<?xi8>
+ test.copy(%2, %arg1) : (memref<?xi8>, memref<?xi8>)
+ return
+}