@@ -647,6 +647,38 @@ void setSyclFixedTargetsMD(const std::vector<Function *> &EntryPoints,
647647 F->setMetadata (" sycl_fixed_targets" , MDN);
648648}
649649
650+ void collectVirtualFunctionSetInfo (
651+ Function &F, StringMap<SmallVector<Function *, 4 >> &VirtualFunctionSets) {
652+ if (!F.hasFnAttribute (" indirectly-callable" ))
653+ return ;
654+ Attribute IndirectlyCallableAttr = F.getFnAttribute (" indirectly-callable" );
655+ StringRef SetName = IndirectlyCallableAttr.getValueAsString ();
656+ VirtualFunctionSets[SetName].push_back (&F);
657+ }
658+
659+ // For each set S of virtual functions that F declares,
660+ // propagate S through the CG and then add the aspects
661+ // used by S to F.
662+ void processDeclaredVirtualFunctionSets (
663+ Function *F, CallGraphTy &CG, FunctionToAspectsMapTy &AspectsMap,
664+ SmallPtrSet<const Function *, 16 > &Visited,
665+ StringMap<SmallVector<Function *, 4 >> &VirtualFunctionSets) {
666+ if (!F->hasFnAttribute (" calls-indirectly" ))
667+ return ;
668+ Attribute CallsIndirectlyAttr = F->getFnAttribute (" calls-indirectly" );
669+ SmallVector<StringRef, 4 > DeclaredVirtualFunctionSetNames;
670+ CallsIndirectlyAttr.getValueAsString ().split (DeclaredVirtualFunctionSetNames,
671+ " ," );
672+ auto &AspectsF = AspectsMap[F];
673+ for (auto Name : DeclaredVirtualFunctionSetNames) {
674+ for (auto VFn : VirtualFunctionSets[Name]) {
675+ propagateAspectsThroughCG (VFn, CG, AspectsMap, Visited);
676+ for (auto Aspect : AspectsMap[VFn])
677+ AspectsF.insert (Aspect);
678+ }
679+ }
680+ }
681+
650682// / Returns a map of functions with corresponding used aspects.
651683std::pair<FunctionToAspectsMapTy, FunctionToAspectsMapTy>
652684buildFunctionsToAspectsMap (Module &M, TypeToAspectsMapTy &TypesWithAspects,
@@ -655,16 +687,21 @@ buildFunctionsToAspectsMap(Module &M, TypeToAspectsMapTy &TypesWithAspects,
655687 bool ValidateAspects, bool FP64ConvEmu) {
656688 FunctionToAspectsMapTy FunctionToUsedAspects;
657689 FunctionToAspectsMapTy FunctionToDeclaredAspects;
690+ StringMap<SmallVector<Function *, 4 >> VirtualFunctionSets;
658691 CallGraphTy CG;
659692
660693 for (Function &F : M.functions ()) {
661694 processFunction (F, FunctionToUsedAspects, FunctionToDeclaredAspects,
662695 TypesWithAspects, CG, AspectValues, FP64ConvEmu);
696+ collectVirtualFunctionSetInfo (F, VirtualFunctionSets);
663697 }
664698
665699 SmallPtrSet<const Function *, 16 > Visited;
666- for (Function *F : EntryPoints)
700+ for (Function *F : EntryPoints) {
667701 propagateAspectsThroughCG (F, CG, FunctionToUsedAspects, Visited);
702+ processDeclaredVirtualFunctionSets (F, CG, FunctionToUsedAspects, Visited,
703+ VirtualFunctionSets);
704+ }
668705
669706 if (ValidateAspects)
670707 validateUsedAspectsForFunctions (FunctionToUsedAspects, AspectValues,
0 commit comments