[PGO] Ensure vp data in indexed profile always sorted
authorXinliang David Li <davidxl@google.com>
Fri, 8 Jan 2016 05:45:21 +0000 (05:45 +0000)
committerXinliang David Li <davidxl@google.com>
Fri, 8 Jan 2016 05:45:21 +0000 (05:45 +0000)
Done in  InstrProfWriter to eliminate the need for client
code to do the sorting. The operation is done once and reused
many times so it is more efficient. Update unit test to remove
sorting. Also update expected output of affected tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257145 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ProfileData/InstrProfWriter.cpp
test/tools/llvm-profdata/value-prof.proftext
unittests/ProfileData/InstrProfTest.cpp

index 07667e1221e828154cfc621c0ecba5af42d586ab..f5227248af20fecceac9f886bb94d4e59ab0c844 100644 (file)
@@ -117,6 +117,8 @@ std::error_code InstrProfWriter::addRecord(InstrProfRecord &&I,
     Result = Dest.merge(I, Weight);
   }
 
+  Dest.sortValueData();
+
   // We keep track of the max function count as we go for simplicity.
   // Update this statistic no matter the result of the merge.
   if (Dest.Counts[0] > MaxFunctionCount)
index ca2b1f822097b15a4dbbfe6384ab6308f267a74f..a8f6e8641c679b4e69f7b4a47a4c3e305b7a5f45 100644 (file)
@@ -1,4 +1,4 @@
-# RUN: llvm-profdata show -ic-targets  -all-functions %s | FileCheck %s --check-prefix=IC
+# RUN: llvm-profdata show -ic-targets  -all-functions %s | FileCheck %s --check-prefix=ICTXT
 # RUN: llvm-profdata show -ic-targets -counts -text -all-functions %s | FileCheck %s --check-prefix=ICTEXT
 # RUN: llvm-profdata merge -o %t.profdata  %s
 # RUN: llvm-profdata show -ic-targets  -all-functions %t.profdata | FileCheck %s --check-prefix=IC
@@ -45,10 +45,16 @@ foo2:1000
 1
 foo2:20000
 
+#ICTXT: Indirect Call Site Count: 3
+#ICTXT-NEXT:    Indirect Target Results: 
+#ICTXT-NEXT:   [ 1, foo, 100 ]
+#ICTXT-NEXT:   [ 1, foo2, 1000 ]
+#ICTXT-NEXT:   [ 2, foo2, 20000 ]
+
 #IC: Indirect Call Site Count: 3
 #IC-NEXT:    Indirect Target Results: 
-#IC-NEXT:      [ 1, foo, 100 ]
 #IC-NEXT:      [ 1, foo2, 1000 ]
+#IC-NEXT:      [ 1, foo, 100 ]
 #IC-NEXT:      [ 2, foo2, 20000 ]
 
 #ICTEXT: foo:100
index a4fadd3d65d93256005720e84c662525401109ca..b71712fba7d974f4a29929c168e9ae85ea555e21 100644 (file)
@@ -159,11 +159,6 @@ TEST_F(InstrProfTest, get_icall_data_read_write) {
 
   std::unique_ptr<InstrProfValueData[]> VD =
       R.get().getValueForSite(IPVK_IndirectCallTarget, 0);
-  // Now sort the target acording to frequency.
-  std::sort(&VD[0], &VD[3],
-            [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
-              return VD1.Count > VD2.Count;
-            });
 
   ASSERT_EQ(3U, VD[0].Count);
   ASSERT_EQ(2U, VD[1].Count);
@@ -211,11 +206,6 @@ TEST_F(InstrProfTest, get_icall_data_read_write_with_weight) {
 
   std::unique_ptr<InstrProfValueData[]> VD =
       R.get().getValueForSite(IPVK_IndirectCallTarget, 0);
-  // Now sort the target acording to frequency.
-  std::sort(&VD[0], &VD[3],
-            [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
-              return VD1.Count > VD2.Count;
-            });
   ASSERT_EQ(30U, VD[0].Count);
   ASSERT_EQ(20U, VD[1].Count);
   ASSERT_EQ(10U, VD[2].Count);
@@ -269,11 +259,6 @@ TEST_F(InstrProfTest, get_icall_data_read_write_big_endian) {
 
   std::unique_ptr<InstrProfValueData[]> VD =
       R.get().getValueForSite(IPVK_IndirectCallTarget, 0);
-  // Now sort the target acording to frequency.
-  std::sort(&VD[0], &VD[3],
-            [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
-              return VD1.Count > VD2.Count;
-            });
   ASSERT_EQ(StringRef((const char *)VD[0].Value, 7), StringRef("callee3"));
   ASSERT_EQ(StringRef((const char *)VD[1].Value, 7), StringRef("callee2"));
   ASSERT_EQ(StringRef((const char *)VD[2].Value, 7), StringRef("callee1"));
@@ -365,11 +350,6 @@ TEST_F(InstrProfTest, get_icall_data_merge1) {
 
   std::unique_ptr<InstrProfValueData[]> VD =
       R.get().getValueForSite(IPVK_IndirectCallTarget, 0);
-  // Now sort the target acording to frequency.
-  std::sort(&VD[0], &VD[4],
-            [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
-              return VD1.Count > VD2.Count;
-            });
   ASSERT_EQ(StringRef((const char *)VD[0].Value, 7), StringRef("callee2"));
   ASSERT_EQ(7U, VD[0].Count);
   ASSERT_EQ(StringRef((const char *)VD[1].Value, 7), StringRef("callee3"));
@@ -381,10 +361,6 @@ TEST_F(InstrProfTest, get_icall_data_merge1) {
 
   std::unique_ptr<InstrProfValueData[]> VD_2(
       R.get().getValueForSite(IPVK_IndirectCallTarget, 2));
-  std::sort(&VD_2[0], &VD_2[4],
-            [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
-              return VD1.Count > VD2.Count;
-            });
   ASSERT_EQ(StringRef((const char *)VD_2[0].Value, 7), StringRef("callee3"));
   ASSERT_EQ(6U, VD_2[0].Count);
   ASSERT_EQ(StringRef((const char *)VD_2[1].Value, 7), StringRef("callee4"));
@@ -401,10 +377,6 @@ TEST_F(InstrProfTest, get_icall_data_merge1) {
 
   std::unique_ptr<InstrProfValueData[]> VD_4(
       R.get().getValueForSite(IPVK_IndirectCallTarget, 4));
-  std::sort(&VD_4[0], &VD_4[3],
-            [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
-              return VD1.Count > VD2.Count;
-            });
   ASSERT_EQ(StringRef((const char *)VD_4[0].Value, 7), StringRef("callee3"));
   ASSERT_EQ(6U, VD_4[0].Count);
   ASSERT_EQ(StringRef((const char *)VD_4[1].Value, 7), StringRef("callee2"));