merge remote changes
This commit is contained in:
@@ -23,7 +23,27 @@ static bool isAddressOnlyHostOp(Operation* op) {
|
||||
memref::SubViewOp,
|
||||
memref::CastOp,
|
||||
memref::CollapseShapeOp,
|
||||
memref::ExpandShapeOp>(op);
|
||||
memref::ExpandShapeOp,
|
||||
memref::CopyOp>(op);
|
||||
}
|
||||
|
||||
// Looser than isCodegenAddressableValue: follows view ops without requiring contiguity.
|
||||
// Used for memref.copy operands which may be non-contiguous subviews.
|
||||
static bool isBaseAddressableValue(Value value) {
|
||||
while (true) {
|
||||
if (isa<BlockArgument>(value))
|
||||
return true;
|
||||
Operation* defOp = value.getDefiningOp();
|
||||
if (!defOp)
|
||||
return false;
|
||||
if (isa<memref::AllocOp, memref::GetGlobalOp>(defOp))
|
||||
return true;
|
||||
if (auto subview = dyn_cast<memref::SubViewOp>(defOp)) { value = subview.getSource(); continue; }
|
||||
if (auto cast = dyn_cast<memref::CastOp>(defOp)) { value = cast.getSource(); continue; }
|
||||
if (auto collapse = dyn_cast<memref::CollapseShapeOp>(defOp)) { value = collapse.getSrc(); continue; }
|
||||
if (auto expand = dyn_cast<memref::ExpandShapeOp>(defOp)) { value = expand.getSrc(); continue; }
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool isCodegenAddressableValue(Value value) {
|
||||
@@ -183,6 +203,13 @@ private:
|
||||
return verifyAddressOnlySource(op, collapseOp.getSrc());
|
||||
if (auto expandOp = dyn_cast<memref::ExpandShapeOp>(op))
|
||||
return verifyAddressOnlySource(op, expandOp.getSrc());
|
||||
if (auto copyOp = dyn_cast<memref::CopyOp>(op)) {
|
||||
if (!isBaseAddressableValue(copyOp.getSource()) || !isBaseAddressableValue(copyOp.getTarget())) {
|
||||
op->emitOpError("depends on a value that is not backed by addressable storage");
|
||||
return failure();
|
||||
}
|
||||
return success();
|
||||
}
|
||||
return success();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user