@@ -167,25 +167,30 @@ class LLVMSymbolLinkerInterface : public SymbolLinkerInterface {
167167
168168 StringRef getSymbol (Operation *op) const override { return symbol (op); }
169169
170+ ConflictPair join (ConflictPair existing, Operation *src) const {
171+ assert (!existing.hasConflict () && " expected non-conflicting pair" );
172+ if (isLocalLinkage (getLinkage (existing.src )))
173+ return ConflictPair::noConflict (existing.src );
174+ return {existing.src , src};
175+ }
176+
170177 ConflictPair findConflict (Operation *src) const override {
171178 assert (canBeLinked (src) && " expected linkable operation" );
172179
173180 if (isLocalLinkage (getLinkage (src)))
174181 return ConflictPair::noConflict (src);
175182
176- // TODO: make lookup through module state
177183 if (auto it = summary.find (getSymbol (src)); it != summary.end ()) {
178- Operation *dst = it->second ;
179- if (dst != src && !isLocalLinkage (getLinkage (dst))) {
180- return {dst, src};
181- }
184+ return join (it->second , src);
182185 }
183186
184187 return ConflictPair::noConflict (src);
185188 }
186189
187190 bool isLinkNeeded (ConflictPair pair, bool forDependency) const override {
188191 assert (canBeLinked (pair.src ) && " expected linkable operation" );
192+ if (pair.src == pair.dst )
193+ return false ;
189194
190195 LLVM::Linkage srcLinkage = getLinkage (pair.src );
191196
@@ -320,21 +325,13 @@ class LLVMSymbolLinkerInterface : public SymbolLinkerInterface {
320325 valuesToClone.insert (*linkFromSrc ? pair.dst : pair.src );
321326
322327 if (*linkFromSrc)
323- registerForLink (pair) ;
328+ summary[ getSymbol (pair. src )] = pair ;
324329 return success ();
325330 }
326331
327332 void registerForLink (Operation *op) override {
328333 assert (canBeLinked (op) && " expected linkable operation" );
329- registerForLink (ConflictPair::noConflict (op));
330- }
331-
332- void registerForLink (ConflictPair pair) {
333- StringRef sym = getSymbol (pair.src );
334- assert (!summary.contains (sym) && " expected unique symbol" );
335- summary[sym] = pair.src ;
336-
337- valuesToLink.insert (pair);
334+ summary[getSymbol (op)] = ConflictPair::noConflict (op);
338335 }
339336
340337 LogicalResult initialize (ModuleOp src) override {
@@ -354,7 +351,7 @@ class LLVMSymbolLinkerInterface : public SymbolLinkerInterface {
354351 // }
355352
356353 IRMover mover (dst);
357- return mover.move (valuesToLink. getArrayRef () );
354+ return mover.move (summary );
358355 }
359356
360357 Operation *prototype (ConflictPair pair) const {
@@ -374,10 +371,10 @@ class LLVMSymbolLinkerInterface : public SymbolLinkerInterface {
374371 Operation *materialize (ConflictPair pair, ModuleOp dst) const override {
375372 // Make definition if destination does not have one or has only declaration
376373 bool forDefinition = !pair.dst || isDeclaration (pair.dst );
377- if (!forDefinition)
374+ if (!forDefinition || isDeclaration (pair. src ) )
378375 return prototype (pair);
379376
380- // Definition laready exists
377+ // Definition already exists
381378 if (pair.dst && !isDeclaration (pair.dst ))
382379 return pair.dst ;
383380
@@ -411,13 +408,11 @@ class LLVMSymbolLinkerInterface : public SymbolLinkerInterface {
411408 }
412409
413410private:
414- llvm::StringMap<Operation *> summary;
415-
416411 std::unique_ptr<SymbolTable> symbolTable;
417412
418413 SetVector<Operation *> valuesToClone;
419414
420- SetVector <ConflictPair> valuesToLink ;
415+ llvm::StringMap <ConflictPair> summary ;
421416};
422417
423418// ===----------------------------------------------------------------------===//
0 commit comments