[llvm] r269131 - Reapply r266477 and r266488
Xinliang David Li via llvm-commits
llvm-commits at lists.llvm.org
Tue May 10 23:47:31 PDT 2016
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/20160510/71ae9c65/attachment-0001.html>
More information about the llvm-commits
mailing list