36 DeviceOp deviceOp = getOperation();
38 for (
auto coreOp : deviceOp.getOps<CoreOp>()) {
42 auto thisTile = dyn_cast<TileOp>(coreOp.getTile().getDefiningOp());
43 int col = thisTile.colIndex();
44 int row = thisTile.rowIndex();
47 SmallVector<TileOp, 4> accessibleTiles;
48 for (
auto tile : deviceOp.getOps<TileOp>())
49 if (
int dstRow = tile.rowIndex();
50 targetModel.isLegalMemAffinity(
col,
row, tile.colIndex(), dstRow))
51 accessibleTiles.push_back(tile);
53 for (
auto tile : accessibleTiles) {
54 int dstCol = tile.colIndex();
55 int dstRow = tile.rowIndex();
58 for (
auto user : tile.getResult().getUsers())
59 if (
auto lock = dyn_cast<LockOp>(user)) {
65 if (llvm::none_of(lock.getResult().getUsers(),
66 [&](Operation *user) {
67 return user->getParentOp() == coreOp;
71 auto lockIndexOffset =
72 targetModel.getLockLocalBaseIndex(
col,
row, dstCol, dstRow);
74 llvm_unreachable(
"Found illegal lock user!");
77 lockIndexOffset.value() + lock.getLockIDValue();
80 OpBuilder::atBlockBegin(&coreOp.getBody().front());
82 Value coreLockIDValue = arith::ConstantIndexOp::create(
83 builder, builder.getUnknownLoc(), localLockIndex);
84 lock.getResult().replaceUsesWithIf(
85 coreLockIDValue, [&](OpOperand &opOperand) {
86 return opOperand.getOwner()->getParentOp() == coreOp;