diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp | 52 | 
1 files changed, 52 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp b/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp index d2a02143e4e7..5762f1906a16 100644 --- a/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp +++ b/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp @@ -1026,6 +1026,51 @@ public:      return N;    } +  /// Strip "amdgpu-no-lds-kernel-id" from any functions where we may have +  /// introduced its use. If AMDGPUAttributor ran prior to the pass, we inferred +  /// the lack of llvm.amdgcn.lds.kernel.id calls. +  void removeNoLdsKernelIdFromReachable(CallGraph &CG, Function *KernelRoot) { +    KernelRoot->removeFnAttr("amdgpu-no-lds-kernel-id"); + +    SmallVector<Function *> Tmp({CG[KernelRoot]->getFunction()}); +    if (!Tmp.back()) +      return; + +    SmallPtrSet<Function *, 8> Visited; +    bool SeenUnknownCall = false; + +    do { +      Function *F = Tmp.pop_back_val(); + +      for (auto &N : *CG[F]) { +        if (!N.second) +          continue; + +        Function *Callee = N.second->getFunction(); +        if (!Callee) { +          if (!SeenUnknownCall) { +            SeenUnknownCall = true; + +            // If we see any indirect calls, assume nothing about potential +            // targets. +            // TODO: This could be refined to possible LDS global users. +            for (auto &N : *CG.getExternalCallingNode()) { +              Function *PotentialCallee = N.second->getFunction(); +              if (!isKernelLDS(PotentialCallee)) +                PotentialCallee->removeFnAttr("amdgpu-no-lds-kernel-id"); +            } + +            continue; +          } +        } + +        Callee->removeFnAttr("amdgpu-no-lds-kernel-id"); +        if (Visited.insert(Callee).second) +          Tmp.push_back(Callee); +      } +    } while (!Tmp.empty()); +  } +    DenseMap<Function *, GlobalVariable *> lowerDynamicLDSVariables(        Module &M, LDSUsesInfoTy &LDSUsesInfo,        DenseSet<Function *> const &KernelsThatIndirectlyAllocateDynamicLDS, @@ -1175,6 +1220,13 @@ public:            M, TableLookupVariablesOrdered, OrderedKernels, KernelToReplacement);        replaceUsesInInstructionsWithTableLookup(M, TableLookupVariablesOrdered,                                                 LookupTable); + +      // Strip amdgpu-no-lds-kernel-id from all functions reachable from the +      // kernel. We may have inferred this wasn't used prior to the pass. +      // +      // TODO: We could filter out subgraphs that do not access LDS globals. +      for (Function *F : KernelsThatAllocateTableLDS) +        removeNoLdsKernelIdFromReachable(CG, F);      }      DenseMap<Function *, GlobalVariable *> KernelToCreatedDynamicLDS =  | 
