[llvm] r302597 - [ProfileSummary] Make getProfileCount a non-static member function.

Easwaran Raman via llvm-commits llvm-commits at lists.llvm.org
Wed May 10 11:09:39 PDT 2017


Thanks for letting me know. Teresa is testing a fix and will submit that
soon.

On Wed, May 10, 2017 at 10:53 AM, Kostya Serebryany <kcc at google.com> wrote:

> This makes the ubsan bot sad, please fix or revert ASAP.
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-
> linux-fast/builds/4831/steps/check-llvm%20ubsan/logs/stdio
>
> lib/Analysis/ModuleSummaryAnalysis.cpp:235:33: runtime error: member call on null pointer of type 'llvm::ProfileSummaryInfo'
>     #0 0x216ffea in computeFunctionSummary(llvm::ModuleSummaryIndex&, llvm::Module const&, llvm::Function const&, llvm::BlockFrequencyInfo*, llvm::ProfileSummaryInfo*, bool, llvm::DenseSet<unsigned long, llvm::DenseMapInfo<unsigned long> >&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp:235:33
>
>
>
>
> On Tue, May 9, 2017 at 4:21 PM, Easwaran Raman via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: eraman
>> Date: Tue May  9 18:21:10 2017
>> New Revision: 302597
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=302597&view=rev
>> Log:
>> [ProfileSummary] Make getProfileCount a non-static member function.
>>
>> This change is required because the notion of count is different for
>> sample profiling and getProfileCount will need to determine the
>> underlying profile type.
>>
>> Differential revision: https://reviews.llvm.org/D33012
>>
>> Modified:
>>     llvm/trunk/include/llvm/Analysis/ProfileSummaryInfo.h
>>     llvm/trunk/include/llvm/Transforms/Utils/Cloning.h
>>     llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
>>     llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>>     llvm/trunk/lib/Transforms/IPO/PartialInlining.cpp
>>     llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ProfileSummaryInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>> Analysis/ProfileSummaryInfo.h?rev=302597&r1=302596&r2=302597&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/include/llvm/Analysis/ProfileSummaryInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/ProfileSummaryInfo.h Tue May  9
>> 18:21:10 2017
>> @@ -67,8 +67,8 @@ public:
>>    }
>>
>>    /// Returns the profile count for \p CallInst.
>> -  static Optional<uint64_t> getProfileCount(const Instruction *CallInst,
>> -                                            BlockFrequencyInfo *BFI);
>> +  Optional<uint64_t> getProfileCount(const Instruction *CallInst,
>> +                                     BlockFrequencyInfo *BFI);
>>    /// \brief Returns true if \p F has hot function entry.
>>    bool isFunctionEntryHot(const Function *F);
>>    /// Returns true if \p F has hot function entry or hot call edge.
>>
>> Modified: llvm/trunk/include/llvm/Transforms/Utils/Cloning.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>> Transforms/Utils/Cloning.h?rev=302597&r1=302596&r2=302597&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/include/llvm/Transforms/Utils/Cloning.h (original)
>> +++ llvm/trunk/include/llvm/Transforms/Utils/Cloning.h Tue May  9
>> 18:21:10 2017
>> @@ -43,6 +43,7 @@ class InvokeInst;
>>  class Loop;
>>  class LoopInfo;
>>  class Module;
>> +class ProfileSummaryInfo;
>>  class ReturnInst;
>>
>>  /// Return an exact copy of the specified module
>> @@ -175,15 +176,17 @@ public:
>>    explicit InlineFunctionInfo(CallGraph *cg = nullptr,
>>                                std::function<AssumptionCache &(Function
>> &)>
>>                                    *GetAssumptionCache = nullptr,
>> +                              ProfileSummaryInfo *PSI = nullptr,
>>                                BlockFrequencyInfo *CallerBFI = nullptr,
>>                                BlockFrequencyInfo *CalleeBFI = nullptr)
>> -      : CG(cg), GetAssumptionCache(GetAssumptionCache),
>> CallerBFI(CallerBFI),
>> -        CalleeBFI(CalleeBFI) {}
>> +      : CG(cg), GetAssumptionCache(GetAssumptionCache), PSI(PSI),
>> +        CallerBFI(CallerBFI), CalleeBFI(CalleeBFI) {}
>>
>>    /// CG - If non-null, InlineFunction will update the callgraph to
>> reflect the
>>    /// changes it makes.
>>    CallGraph *CG;
>>    std::function<AssumptionCache &(Function &)> *GetAssumptionCache;
>> +  ProfileSummaryInfo *PSI;
>>    BlockFrequencyInfo *CallerBFI, *CalleeBFI;
>>
>>    /// StaticAllocas - InlineFunction fills this in with all static
>> allocas that
>>
>> Modified: llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/
>> ModuleSummaryAnalysis.cpp?rev=302597&r1=302596&r2=302597&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp Tue May  9
>> 18:21:10 2017
>> @@ -232,7 +232,7 @@ computeFunctionSummary(ModuleSummaryInde
>>          }
>>          // We should have named any anonymous globals
>>          assert(CalledFunction->hasName());
>> -        auto ScaledCount = ProfileSummaryInfo::getProfileCount(&I, BFI);
>> +        auto ScaledCount = PSI->getProfileCount(&I, BFI);
>>          auto Hotness = ScaledCount ? getHotness(ScaledCount.getValue(),
>> PSI)
>>                                     : CalleeInfo::HotnessType::Unknown;
>>
>>
>> Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transform
>> s/IPO/Inliner.cpp?rev=302597&r1=302596&r2=302597&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Tue May  9 18:21:10 2017
>> @@ -502,7 +502,7 @@ inlineCallsImpl(CallGraphSCC &SCC, CallG
>>          std::swap(CallSites[i--], CallSites[--FirstCallInSCC]);
>>
>>    InlinedArrayAllocasTy InlinedArrayAllocas;
>> -  InlineFunctionInfo InlineInfo(&CG, &GetAssumptionCache);
>> +  InlineFunctionInfo InlineInfo(&CG, &GetAssumptionCache, PSI);
>>
>>    // Now that we have all of the call sites, loop over them and inline
>> them if
>>    // it looks profitable to do so.
>> @@ -872,7 +872,7 @@ PreservedAnalyses InlinerPass::run(LazyC
>>        // Setup the data structure used to plumb customization into the
>>        // `InlineFunction` routine.
>>        InlineFunctionInfo IFI(
>> -          /*cg=*/nullptr, &GetAssumptionCache,
>> +          /*cg=*/nullptr, &GetAssumptionCache, PSI,
>>            &FAM.getResult<BlockFrequencyAnalysis>(*(CS.getCaller())),
>>            &FAM.getResult<BlockFrequencyAnalysis>(Callee));
>>
>>
>> Modified: llvm/trunk/lib/Transforms/IPO/PartialInlining.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transform
>> s/IPO/PartialInlining.cpp?rev=302597&r1=302596&r2=302597&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Transforms/IPO/PartialInlining.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/PartialInlining.cpp Tue May  9
>> 18:21:10 2017
>> @@ -473,7 +473,7 @@ Function *PartialInlinerImpl::unswitchFu
>>               << ore::NV("Callee", F) << " partially inlined into "
>>               << ore::NV("Caller", CS.getCaller()));
>>
>> -    InlineFunctionInfo IFI(nullptr, GetAssumptionCache);
>> +    InlineFunctionInfo IFI(nullptr, GetAssumptionCache, PSI);
>>      InlineFunction(CS, IFI);
>>      NumPartialInlining++;
>>      // update stats
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transform
>> s/Utils/InlineFunction.cpp?rev=302597&r1=302596&r2=302597&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Tue May  9
>> 18:21:10 2017
>> @@ -1396,11 +1396,12 @@ static void updateCallerBFI(BasicBlock *
>>  /// Update the branch metadata for cloned call instructions.
>>  static void updateCallProfile(Function *Callee, const ValueToValueMapTy
>> &VMap,
>>                                const Optional<uint64_t> &CalleeEntryCount,
>> -                              const Instruction *TheCall) {
>> +                              const Instruction *TheCall,
>> +                              ProfileSummaryInfo *PSI) {
>>    if (!CalleeEntryCount.hasValue() || CalleeEntryCount.getValue() < 1)
>>      return;
>>    Optional<uint64_t> CallSiteCount =
>> -      ProfileSummaryInfo::getProfileCount(TheCall, nullptr);
>> +      PSI ? PSI->getProfileCount(TheCall, nullptr) : None;
>>    uint64_t CallCount =
>>        std::min(CallSiteCount.hasValue() ? CallSiteCount.getValue() : 0,
>>                 CalleeEntryCount.getValue());
>> @@ -1423,16 +1424,16 @@ static void updateCallProfile(Function *
>>  /// The callsite's block count is subtracted from the callee's function
>> entry
>>  /// count.
>>  static void updateCalleeCount(BlockFrequencyInfo *CallerBFI, BasicBlock
>> *CallBB,
>> -                              Instruction *CallInst, Function *Callee) {
>> +                              Instruction *CallInst, Function *Callee,
>> +                              ProfileSummaryInfo *PSI) {
>>    // If the callee has a original count of N, and the estimated count of
>>    // callsite is M, the new callee count is set to N - M. M is estimated
>> from
>>    // the caller's entry count, its entry block frequency and the block
>> frequency
>>    // of the callsite.
>>    Optional<uint64_t> CalleeCount = Callee->getEntryCount();
>> -  if (!CalleeCount.hasValue())
>> +  if (!CalleeCount.hasValue() || !PSI)
>>      return;
>> -  Optional<uint64_t> CallCount =
>> -      ProfileSummaryInfo::getProfileCount(CallInst, CallerBFI);
>> +  Optional<uint64_t> CallCount = PSI->getProfileCount(CallInst,
>> CallerBFI);
>>    if (!CallCount.hasValue())
>>      return;
>>    // Since CallSiteCount is an estimate, it could exceed the original
>> callee
>> @@ -1635,9 +1636,10 @@ bool llvm::InlineFunction(CallSite CS, I
>>        updateCallerBFI(OrigBB, VMap, IFI.CallerBFI, IFI.CalleeBFI,
>>                        CalledFunc->front());
>>
>> -    updateCallProfile(CalledFunc, VMap, CalledFunc->getEntryCount(),
>> TheCall);
>> +    updateCallProfile(CalledFunc, VMap, CalledFunc->getEntryCount(),
>> TheCall,
>> +                      IFI.PSI);
>>      // Update the profile count of callee.
>> -    updateCalleeCount(IFI.CallerBFI, OrigBB, TheCall, CalledFunc);
>> +    updateCalleeCount(IFI.CallerBFI, OrigBB, TheCall, CalledFunc,
>> IFI.PSI);
>>
>>      // Inject byval arguments initialization.
>>      for (std::pair<Value*, Value*> &Init : ByValInit)
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170510/eb431b91/attachment-0001.html>


More information about the llvm-commits mailing list