diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-06 20:13:21 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-06 20:13:21 +0000 | 
| commit | 7e7b6700743285c0af506ac6299ddf82ebd434b9 (patch) | |
| tree | 578d2ea1868b77f3dff145df7f8f3fe73272c09e /lib/Analysis | |
| parent | 4b570baa7e867c652fa7d690585098278082fae9 (diff) | |
Notes
Diffstat (limited to 'lib/Analysis')
| -rw-r--r-- | lib/Analysis/ModuleSummaryAnalysis.cpp | 120 | ||||
| -rw-r--r-- | lib/Analysis/TargetTransformInfo.cpp | 5 | 
2 files changed, 97 insertions, 28 deletions
diff --git a/lib/Analysis/ModuleSummaryAnalysis.cpp b/lib/Analysis/ModuleSummaryAnalysis.cpp index 1d2ffc1abe1f..6387bb36166e 100644 --- a/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -80,10 +80,15 @@ static CalleeInfo::HotnessType getHotness(uint64_t ProfileCount,    return CalleeInfo::HotnessType::None;  } -static void computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, -                                   const Function &F, BlockFrequencyInfo *BFI, -                                   ProfileSummaryInfo *PSI, -                                   bool HasLocalsInUsed) { +static bool isNonRenamableLocal(const GlobalValue &GV) { +  return GV.hasSection() && GV.hasLocalLinkage(); +} + +static void +computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, +                       const Function &F, BlockFrequencyInfo *BFI, +                       ProfileSummaryInfo *PSI, bool HasLocalsInUsed, +                       DenseSet<GlobalValue::GUID> &CantBePromoted) {    // Summary not currently supported for anonymous functions, they should    // have been named.    assert(F.hasName()); @@ -178,37 +183,64 @@ static void computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M,        }      } -  GlobalValueSummary::GVFlags Flags(F); +  bool NonRenamableLocal = isNonRenamableLocal(F); +  bool NotEligibleForImport = +      NonRenamableLocal || HasInlineAsmMaybeReferencingInternal || +      // Inliner doesn't handle variadic functions. +      // FIXME: refactor this to use the same code that inliner is using. +      F.isVarArg(); +  GlobalValueSummary::GVFlags Flags(F.getLinkage(), NotEligibleForImport, +                                    /* LiveRoot = */ false);    auto FuncSummary = llvm::make_unique<FunctionSummary>(        Flags, NumInsts, RefEdges.takeVector(), CallGraphEdges.takeVector(),        TypeTests.takeVector()); -  if (HasInlineAsmMaybeReferencingInternal) -    FuncSummary->setHasInlineAsmMaybeReferencingInternal(); +  if (NonRenamableLocal) +    CantBePromoted.insert(F.getGUID());    Index.addGlobalValueSummary(F.getName(), std::move(FuncSummary));  } -static void computeVariableSummary(ModuleSummaryIndex &Index, -                                   const GlobalVariable &V) { +static void +computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V, +                       DenseSet<GlobalValue::GUID> &CantBePromoted) {    SetVector<ValueInfo> RefEdges;    SmallPtrSet<const User *, 8> Visited;    findRefEdges(&V, RefEdges, Visited); -  GlobalValueSummary::GVFlags Flags(V); +  bool NonRenamableLocal = isNonRenamableLocal(V); +  GlobalValueSummary::GVFlags Flags(V.getLinkage(), NonRenamableLocal, +                                    /* LiveRoot = */ false);    auto GVarSummary =        llvm::make_unique<GlobalVarSummary>(Flags, RefEdges.takeVector()); +  if (NonRenamableLocal) +    CantBePromoted.insert(V.getGUID());    Index.addGlobalValueSummary(V.getName(), std::move(GVarSummary));  } -static void computeAliasSummary(ModuleSummaryIndex &Index, -                                const GlobalAlias &A) { -  GlobalValueSummary::GVFlags Flags(A); +static void +computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, +                    DenseSet<GlobalValue::GUID> &CantBePromoted) { +  bool NonRenamableLocal = isNonRenamableLocal(A); +  GlobalValueSummary::GVFlags Flags(A.getLinkage(), NonRenamableLocal, +                                    /* LiveRoot = */ false);    auto AS = llvm::make_unique<AliasSummary>(Flags, ArrayRef<ValueInfo>{});    auto *Aliasee = A.getBaseObject();    auto *AliaseeSummary = Index.getGlobalValueSummary(*Aliasee);    assert(AliaseeSummary && "Alias expects aliasee summary to be parsed");    AS->setAliasee(AliaseeSummary); +  if (NonRenamableLocal) +    CantBePromoted.insert(A.getGUID());    Index.addGlobalValueSummary(A.getName(), std::move(AS));  } +// Set LiveRoot flag on entries matching the given value name. +static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name) { +  auto SummaryList = +      Index.findGlobalValueSummaryList(GlobalValue::getGUID(Name)); +  if (SummaryList == Index.end()) +    return; +  for (auto &Summary : SummaryList->second) +    Summary->setLiveRoot(); +} +  ModuleSummaryIndex llvm::buildModuleSummaryIndex(      const Module &M,      std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback, @@ -226,9 +258,12 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(    collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);    // Next collect those in the llvm.compiler.used set.    collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ true); +  DenseSet<GlobalValue::GUID> CantBePromoted;    for (auto *V : Used) { -    if (V->hasLocalLinkage()) +    if (V->hasLocalLinkage()) {        LocalsUsed.insert(V); +      CantBePromoted.insert(V->getGUID()); +    }    }    // Compute summaries for all functions defined in module, and save in the @@ -248,7 +283,8 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(        BFI = BFIPtr.get();      } -    computeFunctionSummary(Index, M, F, BFI, PSI, !LocalsUsed.empty()); +    computeFunctionSummary(Index, M, F, BFI, PSI, !LocalsUsed.empty(), +                           CantBePromoted);    }    // Compute summaries for all variables defined in module, and save in the @@ -256,20 +292,29 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(    for (const GlobalVariable &G : M.globals()) {      if (G.isDeclaration())        continue; -    computeVariableSummary(Index, G); +    computeVariableSummary(Index, G, CantBePromoted);    }    // Compute summaries for all aliases defined in module, and save in the    // index.    for (const GlobalAlias &A : M.aliases()) -    computeAliasSummary(Index, A); +    computeAliasSummary(Index, A, CantBePromoted);    for (auto *V : LocalsUsed) {      auto *Summary = Index.getGlobalValueSummary(*V);      assert(Summary && "Missing summary for global value"); -    Summary->setNoRename(); +    Summary->setNotEligibleToImport();    } +  // The linker doesn't know about these LLVM produced values, so we need +  // to flag them as live in the index to ensure index-based dead value +  // analysis treats them as live roots of the analysis. +  setLiveRoot(Index, "llvm.used"); +  setLiveRoot(Index, "llvm.compiler.used"); +  setLiveRoot(Index, "llvm.global_ctors"); +  setLiveRoot(Index, "llvm.global_dtors"); +  setLiveRoot(Index, "llvm.global.annotations"); +    if (!M.getModuleInlineAsm().empty()) {      // Collect the local values defined by module level asm, and set up      // summaries for these symbols so that they can be marked as NoRename, @@ -282,7 +327,8 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(      // referenced from there.      ModuleSymbolTable::CollectAsmSymbols(          Triple(M.getTargetTriple()), M.getModuleInlineAsm(), -        [&M, &Index](StringRef Name, object::BasicSymbolRef::Flags Flags) { +        [&M, &Index, &CantBePromoted](StringRef Name, +                                      object::BasicSymbolRef::Flags Flags) {            // Symbols not marked as Weak or Global are local definitions.            if (Flags & (object::BasicSymbolRef::SF_Weak |                         object::BasicSymbolRef::SF_Global)) @@ -291,11 +337,10 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(            if (!GV)              return;            assert(GV->isDeclaration() && "Def in module asm already has definition"); -          GlobalValueSummary::GVFlags GVFlags( -              GlobalValue::InternalLinkage, -              /* NoRename */ true, -              /* HasInlineAsmMaybeReferencingInternal */ false, -              /* IsNotViableToInline */ true); +          GlobalValueSummary::GVFlags GVFlags(GlobalValue::InternalLinkage, +                                              /* NotEligibleToImport */ true, +                                              /* LiveRoot */ true); +          CantBePromoted.insert(GlobalValue::getGUID(Name));            // Create the appropriate summary type.            if (isa<Function>(GV)) {              std::unique_ptr<FunctionSummary> Summary = @@ -303,18 +348,41 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(                      GVFlags, 0, ArrayRef<ValueInfo>{},                      ArrayRef<FunctionSummary::EdgeTy>{},                      ArrayRef<GlobalValue::GUID>{}); -            Summary->setNoRename();              Index.addGlobalValueSummary(Name, std::move(Summary));            } else {              std::unique_ptr<GlobalVarSummary> Summary =                  llvm::make_unique<GlobalVarSummary>(GVFlags,                                                      ArrayRef<ValueInfo>{}); -            Summary->setNoRename();              Index.addGlobalValueSummary(Name, std::move(Summary));            }          });    } +  for (auto &GlobalList : Index) { +    assert(GlobalList.second.size() == 1 && +           "Expected module's index to have one summary per GUID"); +    auto &Summary = GlobalList.second[0]; +    bool AllRefsCanBeExternallyReferenced = +        llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) { +          return !CantBePromoted.count(VI.getValue()->getGUID()); +        }); +    if (!AllRefsCanBeExternallyReferenced) { +      Summary->setNotEligibleToImport(); +      continue; +    } + +    if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) { +      bool AllCallsCanBeExternallyReferenced = llvm::all_of( +          FuncSummary->calls(), [&](const FunctionSummary::EdgeTy &Edge) { +            auto GUID = Edge.first.isGUID() ? Edge.first.getGUID() +                                            : Edge.first.getValue()->getGUID(); +            return !CantBePromoted.count(GUID); +          }); +      if (!AllCallsCanBeExternallyReferenced) +        Summary->setNotEligibleToImport(); +    } +  } +    return Index;  } diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index 2a15b9b264e3..cd8c24630df1 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -389,8 +389,9 @@ unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const {  }  int TargetTransformInfo::getAddressComputationCost(Type *Tp, -                                                   bool IsComplex) const { -  int Cost = TTIImpl->getAddressComputationCost(Tp, IsComplex); +                                                   ScalarEvolution *SE, +                                                   const SCEV *Ptr) const { +  int Cost = TTIImpl->getAddressComputationCost(Tp, SE, Ptr);    assert(Cost >= 0 && "TTI should not produce negative costs!");    return Cost;  }  | 
