[llvm] r269131 - Reapply r266477 and r266488
Easwaran Raman via llvm-commits
llvm-commits at lists.llvm.org
Wed May 11 10:00:09 PDT 2016
I'll move the ProfileSummary class into libSupport and add an
ProfileSummaryInfo analysis pass to access this summary.
Thanks,
Easwaran
On Tue, May 10, 2016 at 11:47 PM, Xinliang David Li <xinliangli at gmail.com>
wrote:
>
>
> On Tue, May 10, 2016 at 11:46 PM, Sean Silva <chisophugis at gmail.com>
> wrote:
>
>>
>>
>> On Tue, May 10, 2016 at 11:44 PM, Xinliang David Li <xinliangli at gmail.com
>> > wrote:
>>
>>>
>>>
>>> On Tue, May 10, 2016 at 11:40 PM, Sean Silva <chisophugis at gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On Tue, May 10, 2016 at 11:30 PM, Xinliang David Li <
>>>> xinliangli at gmail.com> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Tue, May 10, 2016 at 10:45 PM, Sean Silva <chisophugis at gmail.com>
>>>>> wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> On Tue, May 10, 2016 at 9:55 PM, Xinliang David Li <
>>>>>> xinliangli at gmail.com> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Tue, May 10, 2016 at 5:19 PM, Sean Silva via llvm-commits <
>>>>>>> llvm-commits at lists.llvm.org> wrote:
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Tue, May 10, 2016 at 4:41 PM, Easwaran Raman <eraman at google.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> (+cc: vsk)
>>>>>>>>> Hi Sean,
>>>>>>>>> I have reverted the patch. First, could you clarify the "core
>>>>>>>>> libraries" part? Is it libCore alone or a larger set?
>>>>>>>>>
>>>>>>>>
>>>>>>>> Sorry, I used that term for the lack of a better description. More
>>>>>>>> or less I mean anything in lib/ of any LLVM subproject.
>>>>>>>>
>>>>>>>>
>>>>>>>>> I presume it is a larger set since this is part of libProfileData,
>>>>>>>>> but still wanted to check with you. I can think of a couple of ways to
>>>>>>>>> avoid the global: a) do not cache this at the ProfileSummary level and
>>>>>>>>> instead cache it at the client, b) move ProfileSummary to Support (or IR).
>>>>>>>>> What do you suggest is the best way forward?
>>>>>>>>>
>>>>>>>>
>>>>>>>> I have not done an in-depth analysis of the situation, but I think
>>>>>>>> this can be solved by taking the "compute from metadata" design to its
>>>>>>>> logical conclusion and splitting the solution into two parts:
>>>>>>>> - there is a part that lives in the IR library that is computed
>>>>>>>> purely based on the metadata and has no dependence on ProfileData
>>>>>>>> - there is a part that lives in the the ProfileData library that
>>>>>>>> does InstrProf/SampleProf specific annotation of the metadata.
>>>>>>>>
>>>>>>>
>>>>>>> I like the this suggestion of splitting.
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> The annotating part needs the IR library, so it makes sense for
>>>>>>>> some of the shared routines to be in the IR library (such as the list of
>>>>>>>> cutoffs).
>>>>>>>>
>>>>>>>
>>>>>>> I think it is better to put part 1 into Support lib -- both
>>>>>>> BranchProbability and BlockFrequency representation lives there today.
>>>>>>>
>>>>>>
>>>>>> So in the end we would have a data structure ProfileSummary in
>>>>>> libSupport and then a "ProfileSummaryInfo" analysis to complement it?
>>>>>> (analogous to BPI vs. BranchProbability and BFI vs. BlockFrequency).
>>>>>>
>>>>>
>>>>>
>>>>> Roughly like that but there is no need for a separate
>>>>> ProfileSummaryInfo analysis pass. This is because profile summary data is
>>>>> already computed by the profile-use/annotation pass and set as meta data
>>>>> into the module. The whole reason why Easwaran uses a static caching var
>>>>> is to make the access slightly faster (reading from meta data is slow).
>>>>>
>>>>>
>>>>> The current ProfileSummary has a `bool isFunctionHot(Function *F)`
>>>>>> method which seems like it would need a "ProfileSummaryInfo" analysis (or
>>>>>> other solution) so that it can reference `Function` without a layering
>>>>>> violation.
>>>>>>
>>>>>
>>>>>
>>>>> It should only needs very low level interfaces such as
>>>>>
>>>>> 1) given a profile count, tell me if it is hot (with default or
>>>>> specfified cutoff) or cold ..
>>>>> 2) given a hotness cutoff, give me the profile count threshold
>>>>>
>>>>> etc.
>>>>>
>>>>>
>>>>>>
>>>>>> But I'm not sure about the exact details of the final interface you
>>>>>> want optimizations to have access to. Can you explain the final interface
>>>>>> that you want optimization passes to have access to?
>>>>>>
>>>>>
>>>>> Given the above low level interfaces, clients can define higher level
>>>>> interfaces that takes function, BB or callsite to query for the
>>>>> hotness/coldness info.
>>>>>
>>>>
>>>> This sounds like the type of thing that a "ProfileSummaryInfo" pass
>>>> would be good for. Assuming that the clients are N>1 it would be redundant
>>>> to have multiple cases.
>>>>
>>>
>>> Not sure I know what you mean by 'multiple cases' here.
>>>
>>
>> Sorry, that wasn't clear. I meant multiple implementations of the "higher
>> level interfaces" that you mentioned. Ideally we would implement the
>> "higher level interfaces" in one place and an analysis sounds natural.
>>
>
> I see. Implementing this as an immutable pass is certainly doable.
>
> David
>
>
>>
>> -- Sean Silva
>>
>>
>>>
>>> David
>>>
>>>
>>>> Also, the analysis can do the caching.
>>>>
>>>
>>>
>>>
>>>
>>>>
>>>> -- Sean Silva
>>>>
>>>>
>>>>>
>>>>> David
>>>>>
>>>>>
>>>>>> -- Sean Silva
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> David
>>>>>>>
>>>>>>>
>>>>>>>> -- Sean Silva
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Easwaran
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Tue, May 10, 2016 at 4:17 PM, Sean Silva <chisophugis at gmail.com
>>>>>>>>> > wrote:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Tue, May 10, 2016 at 3:03 PM, Easwaran Raman via llvm-commits
>>>>>>>>>> <llvm-commits at lists.llvm.org> wrote:
>>>>>>>>>>
>>>>>>>>>>> Author: eraman
>>>>>>>>>>> Date: Tue May 10 17:03:23 2016
>>>>>>>>>>> New Revision: 269131
>>>>>>>>>>>
>>>>>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=269131&view=rev
>>>>>>>>>>> Log:
>>>>>>>>>>> Reapply r266477 and r266488
>>>>>>>>>>>
>>>>>>>>>>> Added:
>>>>>>>>>>> llvm/trunk/unittests/ProfileData/ProfileSummaryTest.cpp
>>>>>>>>>>> - copied unchanged from r266618,
>>>>>>>>>>> llvm/trunk/unittests/ProfileData/ProfileSummaryTest.cpp
>>>>>>>>>>> Modified:
>>>>>>>>>>> llvm/trunk/include/llvm/ProfileData/ProfileCommon.h
>>>>>>>>>>> llvm/trunk/lib/Analysis/InlineCost.cpp
>>>>>>>>>>> llvm/trunk/lib/Analysis/LLVMBuild.txt
>>>>>>>>>>> llvm/trunk/lib/ProfileData/ProfileSummary.cpp
>>>>>>>>>>> llvm/trunk/test/Transforms/Inline/inline-cold-callee.ll
>>>>>>>>>>> llvm/trunk/test/Transforms/Inline/inline-hot-callee.ll
>>>>>>>>>>> llvm/trunk/unittests/ProfileData/CMakeLists.txt
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/include/llvm/ProfileData/ProfileCommon.h
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/ProfileCommon.h?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/include/llvm/ProfileData/ProfileCommon.h
>>>>>>>>>>> (original)
>>>>>>>>>>> +++ llvm/trunk/include/llvm/ProfileData/ProfileCommon.h Tue May
>>>>>>>>>>> 10 17:03:23 2016
>>>>>>>>>>> @@ -21,6 +21,8 @@
>>>>>>>>>>> #include <vector>
>>>>>>>>>>>
>>>>>>>>>>> #include "llvm/Support/Casting.h"
>>>>>>>>>>> +#include "llvm/Support/ManagedStatic.h"
>>>>>>>>>>> +#include "llvm/Support/Mutex.h"
>>>>>>>>>>>
>>>>>>>>>>> namespace llvm {
>>>>>>>>>>> class Function;
>>>>>>>>>>> @@ -35,6 +37,7 @@ class LLVMContext;
>>>>>>>>>>> class Metadata;
>>>>>>>>>>> class MDTuple;
>>>>>>>>>>> class MDNode;
>>>>>>>>>>> +class Module;
>>>>>>>>>>>
>>>>>>>>>>> inline const char *getHotSectionPrefix() { return ".hot"; }
>>>>>>>>>>> inline const char *getUnlikelySectionPrefix() { return
>>>>>>>>>>> ".unlikely"; }
>>>>>>>>>>> @@ -67,6 +70,14 @@ private:
>>>>>>>>>>> // appears in the profile. The map is kept sorted in the
>>>>>>>>>>> descending order of
>>>>>>>>>>> // counts.
>>>>>>>>>>> std::map<uint64_t, uint32_t, std::greater<uint64_t>>
>>>>>>>>>>> CountFrequencies;
>>>>>>>>>>> + // Compute profile summary for a module.
>>>>>>>>>>> + static ProfileSummary *computeProfileSummary(Module *M);
>>>>>>>>>>> + // Cache of last seen module and its profile summary.
>>>>>>>>>>> + static ManagedStatic<std::pair<Module *,
>>>>>>>>>>> std::unique_ptr<ProfileSummary>>>
>>>>>>>>>>> + CachedSummary;
>>>>>>>>>>> + // Mutex to access summary cache
>>>>>>>>>>> + static ManagedStatic<sys::SmartMutex<true>> CacheMutex;
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hi Easwaran,
>>>>>>>>>>
>>>>>>>>>> In the LLVM core libraries, we don't use globals like this.
>>>>>>>>>>
>>>>>>>>>> Can you please revert and redesign this to avoid the global? For
>>>>>>>>>> example, keeping it in the Module itself? I understand that there are some
>>>>>>>>>> layering issues here, and I'm glad to help with finding a nice solution,
>>>>>>>>>> but putting a global in the LLVM core libraries like this is not acceptable.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>>
>>>>>>>>>> -- Sean Silva
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> +
>>>>>>>>>>> protected:
>>>>>>>>>>> SummaryEntryVector DetailedSummary;
>>>>>>>>>>> std::vector<uint32_t> DetailedSummaryCutoffs;
>>>>>>>>>>> @@ -85,14 +96,12 @@ protected:
>>>>>>>>>>> : PSK(K), DetailedSummary(DetailedSummary),
>>>>>>>>>>> TotalCount(TotalCount),
>>>>>>>>>>> MaxCount(MaxCount), MaxFunctionCount(MaxFunctionCount),
>>>>>>>>>>> NumCounts(NumCounts), NumFunctions(NumFunctions) {}
>>>>>>>>>>> - ~ProfileSummary() = default;
>>>>>>>>>>> inline void addCount(uint64_t Count);
>>>>>>>>>>> /// \brief Return metadata specific to the profile format.
>>>>>>>>>>> /// Derived classes implement this method to return a vector
>>>>>>>>>>> of Metadata.
>>>>>>>>>>> virtual std::vector<Metadata *>
>>>>>>>>>>> getFormatSpecificMD(LLVMContext &Context) = 0;
>>>>>>>>>>> /// \brief Return detailed summary as metadata.
>>>>>>>>>>> Metadata *getDetailedSummaryMD(LLVMContext &Context);
>>>>>>>>>>> -
>>>>>>>>>>> public:
>>>>>>>>>>> static const int Scale = 1000000;
>>>>>>>>>>> Kind getKind() const { return PSK; }
>>>>>>>>>>> @@ -111,6 +120,10 @@ public:
>>>>>>>>>>> static ProfileSummary *getFromMD(Metadata *MD);
>>>>>>>>>>> uint32_t getNumFunctions() { return NumFunctions; }
>>>>>>>>>>> uint64_t getMaxFunctionCount() { return MaxFunctionCount; }
>>>>>>>>>>> + /// \brief Get profile summary associated with module \p M
>>>>>>>>>>> + static inline ProfileSummary *getProfileSummary(Module *M);
>>>>>>>>>>> + virtual ~ProfileSummary() = default;
>>>>>>>>>>> + virtual bool operator==(ProfileSummary &Other);
>>>>>>>>>>> };
>>>>>>>>>>>
>>>>>>>>>>> class InstrProfSummary final : public ProfileSummary {
>>>>>>>>>>> @@ -140,6 +153,7 @@ public:
>>>>>>>>>>> uint64_t getTotalCount() { return TotalCount; }
>>>>>>>>>>> uint64_t getMaxBlockCount() { return MaxCount; }
>>>>>>>>>>> uint64_t getMaxInternalBlockCount() { return
>>>>>>>>>>> MaxInternalBlockCount; }
>>>>>>>>>>> + bool operator==(ProfileSummary &Other) override;
>>>>>>>>>>> };
>>>>>>>>>>>
>>>>>>>>>>> class SampleProfileSummary final : public ProfileSummary {
>>>>>>>>>>> @@ -180,5 +194,24 @@ SummaryEntryVector &ProfileSummary::getD
>>>>>>>>>>> return DetailedSummary;
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> +ProfileSummary *ProfileSummary::getProfileSummary(Module *M) {
>>>>>>>>>>> + if (!M)
>>>>>>>>>>> + return nullptr;
>>>>>>>>>>> + sys::SmartScopedLock<true> Lock(*CacheMutex);
>>>>>>>>>>> + // Computing profile summary for a module involves parsing a
>>>>>>>>>>> fairly large
>>>>>>>>>>> + // metadata and could be expensive. We use a simple cache of
>>>>>>>>>>> the last seen
>>>>>>>>>>> + // module and its profile summary.
>>>>>>>>>>> + if (CachedSummary->first != M) {
>>>>>>>>>>> + auto *Summary = computeProfileSummary(M);
>>>>>>>>>>> + // Do not cache if the summary is empty. This is because a
>>>>>>>>>>> later pass
>>>>>>>>>>> + // (sample profile loader, for example) could attach the
>>>>>>>>>>> summary metadata on
>>>>>>>>>>> + // the module.
>>>>>>>>>>> + if (!Summary)
>>>>>>>>>>> + return nullptr;
>>>>>>>>>>> + CachedSummary->first = M;
>>>>>>>>>>> + CachedSummary->second.reset(Summary);
>>>>>>>>>>> + }
>>>>>>>>>>> + return CachedSummary->second.get();
>>>>>>>>>>> +}
>>>>>>>>>>> } // end namespace llvm
>>>>>>>>>>> #endif
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/lib/Analysis/InlineCost.cpp
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InlineCost.cpp?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/lib/Analysis/InlineCost.cpp (original)
>>>>>>>>>>> +++ llvm/trunk/lib/Analysis/InlineCost.cpp Tue May 10 17:03:23
>>>>>>>>>>> 2016
>>>>>>>>>>> @@ -30,6 +30,7 @@
>>>>>>>>>>> #include "llvm/IR/InstVisitor.h"
>>>>>>>>>>> #include "llvm/IR/IntrinsicInst.h"
>>>>>>>>>>> #include "llvm/IR/Operator.h"
>>>>>>>>>>> +#include "llvm/ProfileData/ProfileCommon.h"
>>>>>>>>>>> #include "llvm/Support/Debug.h"
>>>>>>>>>>> #include "llvm/Support/raw_ostream.h"
>>>>>>>>>>>
>>>>>>>>>>> @@ -630,10 +631,11 @@ void CallAnalyzer::updateThreshold(CallS
>>>>>>>>>>> // a well-tuned heuristic based on *callsite* hotness and not
>>>>>>>>>>> callee hotness.
>>>>>>>>>>> uint64_t FunctionCount = 0, MaxFunctionCount = 0;
>>>>>>>>>>> bool HasPGOCounts = false;
>>>>>>>>>>> - if (Callee.getEntryCount() &&
>>>>>>>>>>> Callee.getParent()->getMaximumFunctionCount()) {
>>>>>>>>>>> + ProfileSummary *PS =
>>>>>>>>>>> ProfileSummary::getProfileSummary(Callee.getParent());
>>>>>>>>>>> + if (Callee.getEntryCount() && PS) {
>>>>>>>>>>> HasPGOCounts = true;
>>>>>>>>>>> FunctionCount = Callee.getEntryCount().getValue();
>>>>>>>>>>> - MaxFunctionCount =
>>>>>>>>>>> Callee.getParent()->getMaximumFunctionCount().getValue();
>>>>>>>>>>> + MaxFunctionCount = PS->getMaxFunctionCount();
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> // Listen to the inlinehint attribute or profile based
>>>>>>>>>>> hotness information
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/lib/Analysis/LLVMBuild.txt
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LLVMBuild.txt?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/lib/Analysis/LLVMBuild.txt (original)
>>>>>>>>>>> +++ llvm/trunk/lib/Analysis/LLVMBuild.txt Tue May 10 17:03:23
>>>>>>>>>>> 2016
>>>>>>>>>>> @@ -19,4 +19,4 @@
>>>>>>>>>>> type = Library
>>>>>>>>>>> name = Analysis
>>>>>>>>>>> parent = Libraries
>>>>>>>>>>> -required_libraries = Core Support
>>>>>>>>>>> +required_libraries = Core ProfileData Support
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/lib/ProfileData/ProfileSummary.cpp
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/ProfileSummary.cpp?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/lib/ProfileData/ProfileSummary.cpp (original)
>>>>>>>>>>> +++ llvm/trunk/lib/ProfileData/ProfileSummary.cpp Tue May 10
>>>>>>>>>>> 17:03:23 2016
>>>>>>>>>>> @@ -15,6 +15,7 @@
>>>>>>>>>>> #include "llvm/IR/Constants.h"
>>>>>>>>>>> #include "llvm/IR/Function.h"
>>>>>>>>>>> #include "llvm/IR/Metadata.h"
>>>>>>>>>>> +#include "llvm/IR/Module.h"
>>>>>>>>>>> #include "llvm/IR/Type.h"
>>>>>>>>>>> #include "llvm/ProfileData/InstrProf.h"
>>>>>>>>>>> #include "llvm/ProfileData/ProfileCommon.h"
>>>>>>>>>>> @@ -32,6 +33,10 @@ const std::vector<uint32_t> ProfileSumma
>>>>>>>>>>> 900000, 950000, 990000, 999000, 999900, 999990, 999999});
>>>>>>>>>>> const char *ProfileSummary::KindStr[2] = {"InstrProf",
>>>>>>>>>>> "SampleProfile"};
>>>>>>>>>>>
>>>>>>>>>>> +ManagedStatic<std::pair<Module *,
>>>>>>>>>>> std::unique_ptr<ProfileSummary>>>
>>>>>>>>>>> + ProfileSummary::CachedSummary;
>>>>>>>>>>> +ManagedStatic<sys::SmartMutex<true>> ProfileSummary::CacheMutex;
>>>>>>>>>>> +
>>>>>>>>>>> void InstrProfSummary::addRecord(const InstrProfRecord &R) {
>>>>>>>>>>> // The first counter is not necessarily an entry count for IR
>>>>>>>>>>> // instrumentation profiles.
>>>>>>>>>>> @@ -86,6 +91,39 @@ void ProfileSummary::computeDetailedSumm
>>>>>>>>>>> }
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> +bool ProfileSummary::operator==(ProfileSummary &Other) {
>>>>>>>>>>> + if (getKind() != Other.getKind())
>>>>>>>>>>> + return false;
>>>>>>>>>>> + if (TotalCount != Other.TotalCount)
>>>>>>>>>>> + return false;
>>>>>>>>>>> + if (MaxCount != Other.MaxCount)
>>>>>>>>>>> + return false;
>>>>>>>>>>> + if (MaxFunctionCount != Other.MaxFunctionCount)
>>>>>>>>>>> + return false;
>>>>>>>>>>> + if (NumFunctions != Other.NumFunctions)
>>>>>>>>>>> + return false;
>>>>>>>>>>> + if (NumCounts != Other.NumCounts)
>>>>>>>>>>> + return false;
>>>>>>>>>>> + std::vector<ProfileSummaryEntry> DS1 = getDetailedSummary();
>>>>>>>>>>> + std::vector<ProfileSummaryEntry> DS2 =
>>>>>>>>>>> Other.getDetailedSummary();
>>>>>>>>>>> + auto CompareSummaryEntry = [](ProfileSummaryEntry &E1,
>>>>>>>>>>> + ProfileSummaryEntry &E2) {
>>>>>>>>>>> + return E1.Cutoff == E2.Cutoff && E1.MinCount == E2.MinCount
>>>>>>>>>>> &&
>>>>>>>>>>> + E1.NumCounts == E2.NumCounts;
>>>>>>>>>>> + };
>>>>>>>>>>> + if (!std::equal(DS1.begin(), DS1.end(), DS2.begin(),
>>>>>>>>>>> CompareSummaryEntry))
>>>>>>>>>>> + return false;
>>>>>>>>>>> + return true;
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> +bool InstrProfSummary::operator==(ProfileSummary &Other) {
>>>>>>>>>>> + InstrProfSummary *OtherIPS =
>>>>>>>>>>> dyn_cast<InstrProfSummary>(&Other);
>>>>>>>>>>> + if (!OtherIPS)
>>>>>>>>>>> + return false;
>>>>>>>>>>> + return MaxInternalBlockCount ==
>>>>>>>>>>> OtherIPS->MaxInternalBlockCount &&
>>>>>>>>>>> + ProfileSummary::operator==(Other);
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> // Returns true if the function is a hot function.
>>>>>>>>>>> bool ProfileSummary::isFunctionHot(const Function *F) {
>>>>>>>>>>> // FIXME: update when summary data is stored in module's
>>>>>>>>>>> metadata.
>>>>>>>>>>> @@ -366,3 +404,9 @@ ProfileSummary *ProfileSummary::getFromM
>>>>>>>>>>> else
>>>>>>>>>>> return nullptr;
>>>>>>>>>>> }
>>>>>>>>>>> +
>>>>>>>>>>> +ProfileSummary *ProfileSummary::computeProfileSummary(Module
>>>>>>>>>>> *M) {
>>>>>>>>>>> + if (Metadata *MD = M->getProfileSummary())
>>>>>>>>>>> + return getFromMD(MD);
>>>>>>>>>>> + return nullptr;
>>>>>>>>>>> +}
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/test/Transforms/Inline/inline-cold-callee.ll
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/inline-cold-callee.ll?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/test/Transforms/Inline/inline-cold-callee.ll
>>>>>>>>>>> (original)
>>>>>>>>>>> +++ llvm/trunk/test/Transforms/Inline/inline-cold-callee.ll Tue
>>>>>>>>>>> May 10 17:03:23 2016
>>>>>>>>>>> @@ -5,7 +5,7 @@
>>>>>>>>>>> ; A callee with identical body does gets inlined because cost
>>>>>>>>>>> fits within the
>>>>>>>>>>> ; inline-threshold
>>>>>>>>>>>
>>>>>>>>>>> -define i32 @callee1(i32 %x) !prof !1 {
>>>>>>>>>>> +define i32 @callee1(i32 %x) !prof !21 {
>>>>>>>>>>> %x1 = add i32 %x, 1
>>>>>>>>>>> %x2 = add i32 %x1, 1
>>>>>>>>>>> %x3 = add i32 %x2, 1
>>>>>>>>>>> @@ -13,7 +13,7 @@ define i32 @callee1(i32 %x) !prof !1 {
>>>>>>>>>>> ret i32 %x3
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> -define i32 @callee2(i32 %x) !prof !2 {
>>>>>>>>>>> +define i32 @callee2(i32 %x) !prof !22 {
>>>>>>>>>>> ; CHECK-LABEL: @callee2(
>>>>>>>>>>> %x1 = add i32 %x, 1
>>>>>>>>>>> %x2 = add i32 %x1, 1
>>>>>>>>>>> @@ -22,7 +22,7 @@ define i32 @callee2(i32 %x) !prof !2 {
>>>>>>>>>>> ret i32 %x3
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> -define i32 @caller2(i32 %y1) !prof !2 {
>>>>>>>>>>> +define i32 @caller2(i32 %y1) !prof !22 {
>>>>>>>>>>> ; CHECK-LABEL: @caller2(
>>>>>>>>>>> ; CHECK: call i32 @callee2
>>>>>>>>>>> ; CHECK-NOT: call i32 @callee1
>>>>>>>>>>> @@ -32,8 +32,19 @@ define i32 @caller2(i32 %y1) !prof !2 {
>>>>>>>>>>> ret i32 %y3
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> -!llvm.module.flags = !{!0}
>>>>>>>>>>> -!0 = !{i32 1, !"MaxFunctionCount", i32 1000}
>>>>>>>>>>> -!1 = !{!"function_entry_count", i64 100}
>>>>>>>>>>> -!2 = !{!"function_entry_count", i64 1}
>>>>>>>>>>> -
>>>>>>>>>>> +!llvm.module.flags = !{!1}
>>>>>>>>>>> +!21 = !{!"function_entry_count", i64 100}
>>>>>>>>>>> +!22 = !{!"function_entry_count", i64 1}
>>>>>>>>>>> +
>>>>>>>>>>> +!1 = !{i32 1, !"ProfileSummary", !2}
>>>>>>>>>>> +!2 = !{!3, !4, !5, !6, !7, !8, !9, !10}
>>>>>>>>>>> +!3 = !{!"ProfileFormat", !"InstrProf"}
>>>>>>>>>>> +!4 = !{!"TotalCount", i64 10000}
>>>>>>>>>>> +!5 = !{!"MaxBlockCount", i64 1000}
>>>>>>>>>>> +!6 = !{!"MaxInternalBlockCount", i64 1}
>>>>>>>>>>> +!7 = !{!"MaxFunctionCount", i64 1000}
>>>>>>>>>>> +!8 = !{!"NumBlocks", i64 3}
>>>>>>>>>>> +!9 = !{!"NumFunctions", i64 3}
>>>>>>>>>>> +!10 = !{!"DetailedSummary", !11}
>>>>>>>>>>> +!11 = !{!12}
>>>>>>>>>>> +!12 = !{i32 10000, i64 0, i32 0}
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/test/Transforms/Inline/inline-hot-callee.ll
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/inline-hot-callee.ll?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/test/Transforms/Inline/inline-hot-callee.ll
>>>>>>>>>>> (original)
>>>>>>>>>>> +++ llvm/trunk/test/Transforms/Inline/inline-hot-callee.ll Tue
>>>>>>>>>>> May 10 17:03:23 2016
>>>>>>>>>>> @@ -5,7 +5,7 @@
>>>>>>>>>>> ; A cold callee with identical body does not get inlined
>>>>>>>>>>> because cost exceeds the
>>>>>>>>>>> ; inline-threshold
>>>>>>>>>>>
>>>>>>>>>>> -define i32 @callee1(i32 %x) !prof !1 {
>>>>>>>>>>> +define i32 @callee1(i32 %x) !prof !20 {
>>>>>>>>>>> %x1 = add i32 %x, 1
>>>>>>>>>>> %x2 = add i32 %x1, 1
>>>>>>>>>>> %x3 = add i32 %x2, 1
>>>>>>>>>>> @@ -13,7 +13,7 @@ define i32 @callee1(i32 %x) !prof !1 {
>>>>>>>>>>> ret i32 %x3
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> -define i32 @callee2(i32 %x) !prof !2 {
>>>>>>>>>>> +define i32 @callee2(i32 %x) !prof !21 {
>>>>>>>>>>> ; CHECK-LABEL: @callee2(
>>>>>>>>>>> %x1 = add i32 %x, 1
>>>>>>>>>>> %x2 = add i32 %x1, 1
>>>>>>>>>>> @@ -22,7 +22,7 @@ define i32 @callee2(i32 %x) !prof !2 {
>>>>>>>>>>> ret i32 %x3
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> -define i32 @caller2(i32 %y1) !prof !2 {
>>>>>>>>>>> +define i32 @caller2(i32 %y1) !prof !21 {
>>>>>>>>>>> ; CHECK-LABEL: @caller2(
>>>>>>>>>>> ; CHECK: call i32 @callee2
>>>>>>>>>>> ; CHECK-NOT: call i32 @callee1
>>>>>>>>>>> @@ -32,8 +32,19 @@ define i32 @caller2(i32 %y1) !prof !2 {
>>>>>>>>>>> ret i32 %y3
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> -!llvm.module.flags = !{!0}
>>>>>>>>>>> -!0 = !{i32 1, !"MaxFunctionCount", i32 10}
>>>>>>>>>>> -!1 = !{!"function_entry_count", i64 10}
>>>>>>>>>>> -!2 = !{!"function_entry_count", i64 1}
>>>>>>>>>>> -
>>>>>>>>>>> +!llvm.module.flags = !{!1}
>>>>>>>>>>> +!20 = !{!"function_entry_count", i64 10}
>>>>>>>>>>> +!21 = !{!"function_entry_count", i64 1}
>>>>>>>>>>> +
>>>>>>>>>>> +!1 = !{i32 1, !"ProfileSummary", !2}
>>>>>>>>>>> +!2 = !{!3, !4, !5, !6, !7, !8, !9, !10}
>>>>>>>>>>> +!3 = !{!"ProfileFormat", !"InstrProf"}
>>>>>>>>>>> +!4 = !{!"TotalCount", i64 10000}
>>>>>>>>>>> +!5 = !{!"MaxBlockCount", i64 10}
>>>>>>>>>>> +!6 = !{!"MaxInternalBlockCount", i64 1}
>>>>>>>>>>> +!7 = !{!"MaxFunctionCount", i64 10}
>>>>>>>>>>> +!8 = !{!"NumBlocks", i64 3}
>>>>>>>>>>> +!9 = !{!"NumFunctions", i64 3}
>>>>>>>>>>> +!10 = !{!"DetailedSummary", !11}
>>>>>>>>>>> +!11 = !{!12}
>>>>>>>>>>> +!12 = !{i32 10000, i64 0, i32 0}
>>>>>>>>>>>
>>>>>>>>>>> Modified: llvm/trunk/unittests/ProfileData/CMakeLists.txt
>>>>>>>>>>> URL:
>>>>>>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ProfileData/CMakeLists.txt?rev=269131&r1=269130&r2=269131&view=diff
>>>>>>>>>>>
>>>>>>>>>>> ==============================================================================
>>>>>>>>>>> --- llvm/trunk/unittests/ProfileData/CMakeLists.txt (original)
>>>>>>>>>>> +++ llvm/trunk/unittests/ProfileData/CMakeLists.txt Tue May 10
>>>>>>>>>>> 17:03:23 2016
>>>>>>>>>>> @@ -8,5 +8,6 @@ set(LLVM_LINK_COMPONENTS
>>>>>>>>>>> add_llvm_unittest(ProfileDataTests
>>>>>>>>>>> CoverageMappingTest.cpp
>>>>>>>>>>> InstrProfTest.cpp
>>>>>>>>>>> + ProfileSummaryTest.cpp
>>>>>>>>>>> SampleProfTest.cpp
>>>>>>>>>>> )
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> llvm-commits mailing list
>>>>>>>>>>> llvm-commits at lists.llvm.org
>>>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> 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/20160511/1ead2ed8/attachment.html>
More information about the llvm-commits
mailing list