Index: lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- lib/Transforms/IPO/SampleProfile.cpp +++ lib/Transforms/IPO/SampleProfile.cpp @@ -513,24 +513,16 @@ /// \returns the weight for \p BB. ErrorOr SampleProfileLoader::getBlockWeight(const BasicBlock *BB) const { - DenseMap CM; + uint64_t Max = 0; + bool HasWeight = false; for (auto &I : BB->getInstList()) { const ErrorOr &R = getInstWeight(I); - if (R) - CM[R.get()]++; - } - if (CM.size() == 0) - return std::error_code(); - uint64_t W = 0, C = 0; - for (const auto &C_W : CM) { - if (C_W.second == W) { - C = std::max(C, C_W.first); - } else if (C_W.second > W) { - C = C_W.first; - W = C_W.second; + if (R) { + Max = std::max(Max, R.get()); + HasWeight = true; } } - return C; + return HasWeight ? ErrorOr(Max) : std::error_code(); } /// \brief Compute and store the weights of every basic block. Index: test/Transforms/SampleProfile/calls.ll =================================================================== --- test/Transforms/SampleProfile/calls.ll +++ test/Transforms/SampleProfile/calls.ll @@ -48,8 +48,8 @@ store i32 %inc, i32* %i, align 4, !dbg !14 %cmp = icmp slt i32 %0, 400000000, !dbg !14 br i1 %cmp, label %while.body, label %while.end, !dbg !14 -; CHECK: edge while.cond -> while.body probability is 0x7ffa4e20 / 0x80000000 = 99.98% [HOT edge] -; CHECK: edge while.cond -> while.end probability is 0x0005b1e0 / 0x80000000 = 0.02% +; CHECK: edge while.cond -> while.body probability is 0x7d9eb367 / 0x80000000 = 98.14% [HOT edge] +; CHECK: edge while.cond -> while.end probability is 0x02614c99 / 0x80000000 = 1.86% while.body: ; preds = %while.cond %1 = load i32, i32* %i, align 4, !dbg !16 @@ -59,8 +59,8 @@ ; both branches out of while.body had the same weight. In reality, ; the edge while.body->if.then is taken most of the time. ; -; CHECK: edge while.body -> if.else probability is 0x0005b1e0 / 0x80000000 = 0.02% -; CHECK: edge while.body -> if.then probability is 0x7ffa4e20 / 0x80000000 = 99.98% [HOT edge] +; CHECK: edge while.body -> if.else probability is 0x00059704 / 0x80000000 = 0.02% +; CHECK: edge while.body -> if.then probability is 0x7ffa68fc / 0x80000000 = 99.98% [HOT edge] if.then: ; preds = %while.body Index: test/Transforms/SampleProfile/fnptr.ll =================================================================== --- test/Transforms/SampleProfile/fnptr.ll +++ test/Transforms/SampleProfile/fnptr.ll @@ -8,10 +8,10 @@ ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/fnptr.prof | opt -analyze -branch-prob | FileCheck %s ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/fnptr.binprof | opt -analyze -branch-prob | FileCheck %s -; CHECK: edge for.body3 -> if.then probability is 0x1a56a56a / 0x80000000 = 20.58% -; CHECK: edge for.body3 -> if.else probability is 0x65a95a96 / 0x80000000 = 79.42% -; CHECK: edge for.inc -> for.inc12 probability is 0x000fdc50 / 0x80000000 = 0.05% -; CHECK: edge for.inc -> for.body3 probability is 0x7ff023b0 / 0x80000000 = 99.95% +; CHECK: edge for.body3 -> if.then probability is 0x19f584f3 / 0x80000000 = 20.28% +; CHECK: edge for.body3 -> if.else probability is 0x660a7b0d / 0x80000000 = 79.72% +; CHECK: edge for.inc -> for.inc12 probability is 0x000f92fb / 0x80000000 = 0.05% +; CHECK: edge for.inc -> for.body3 probability is 0x7ff06d05 / 0x80000000 = 99.95% ; CHECK: edge for.inc12 -> for.end14 probability is 0x04000000 / 0x80000000 = 3.12% ; CHECK: edge for.inc12 -> for.cond1.preheader probability is 0x7c000000 / 0x80000000 = 96.88%