141 DeviceOp device = getOperation();
142 OpBuilder builder = OpBuilder::atBlockTerminator(device.getBody());
146 LLVM_DEBUG(TA.
print(llvm::dbgs()));
147 SmallVector<std::pair<Operation *, Operation *>, 4> tokenChains(
149 SmallVector<std::pair<Operation *, Operation *>, 4> tokenPairs(
151 DenseMap<TileID, Operation *> tiles(TA.
getTiles());
153 DenseMap<std::pair<Operation *, int>,
int> locks;
154 DenseMap<std::pair<Operation *, Operation *>, std::pair<Value, int>>
156 DenseMap<Operation *, std::vector<std::pair<Value, int>>> acqLocks;
157 DenseMap<Operation *, std::vector<std::pair<Value, int>>> relLocks;
159 for (
auto map : tokenChains) {
160 Operation *release = map.first;
161 Operation *acquire = map.second;
165 bool IsRelUserCore = isa<CoreOp>(relUser);
166 bool IsAcqUserCore = isa<CoreOp>(acqUser);
170 LLVM_DEBUG(llvm::dbgs() <<
"\n=== CHECKING TOKEN CHAIN ===\n";
171 release->print(llvm::dbgs());
172 if (IsRelUserCore) llvm::dbgs() <<
" @Core";
173 else llvm::dbgs() <<
" @DMA";
174 llvm::dbgs() <<
" (" << TA.
getCoord(relUser).col <<
", "
175 << TA.
getCoord(relUser).row <<
")" <<
'\n';
176 acquire->print(llvm::dbgs());
177 if (IsAcqUserCore) llvm::dbgs() <<
" @Core";
178 else llvm::dbgs() <<
" @DMA";
179 llvm::dbgs() <<
" (" << TA.
getCoord(acqUser).col <<
", "
180 << TA.
getCoord(acqUser).row <<
")" <<
'\n';);
189 if (!tileOp && ((!IsRelUserCore && IsAcqUserCore) ||
190 (!IsAcqUserCore && IsRelUserCore)))
193 "the lock users of this chain do not have a common lock");
195 TileOp tile = cast<TileOp>(tileOp);
196 int lockID = getLockID(locks, tileOp);
197 assert(lockID >= 0 &&
"No more locks to allocate!");
198 LLVM_DEBUG(llvm::dbgs() <<
"Shared tile \n"; tileOp->print(llvm::dbgs()));
199 LLVM_DEBUG(llvm::dbgs() <<
" LockID: " << lockID <<
'\n');
200 builder.setInsertionPointAfter(tileOp);
201 LockOp lock = LockOp::create(builder, tile.getLoc(), tile, lockID, 0);
203 lockChains[std::make_pair(release, acquire)] = std::make_pair(lock, 1);
205 for (
auto pair : tokenPairs) {
206 Operation *acqFromPair = pair.first;
207 Operation *relFromPair = pair.second;
209 if (relFromPair == release)
210 acqLocks[acqFromPair].emplace_back(lock, 0);
212 if (acqFromPair == acquire)
213 relLocks[relFromPair].emplace_back(lock, 0);
217 ConversionTarget target(getContext());
218 target.addLegalOp<UseLockOp>();
220 RewritePatternSet patterns(&getContext());
224 if (failed(applyPartialConversion(device, target, std::move(patterns))))