From bd0f1079298c66201f89b83cbbe168fb90bc3534 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Fri, 21 Jun 2013 19:30:05 +0000 Subject: BlockFrequency: Saturate at 1 instead of 0 when multiplying a frequency with a branch probability. Zero is used by BlockFrequencyInfo as a special "don't know" value. It also causes a sink for frequencies as you can't ever get off a zero frequency with more multiplies. This recovers a 10% regression on MultiSource/Benchmarks/7zip. A zero frequency was propagated into an inner loop causing excessive spilling. PR16402. llvm-svn: 184584 --- llvm/unittests/Support/BlockFrequencyTest.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'llvm/unittests/Support/BlockFrequencyTest.cpp') diff --git a/llvm/unittests/Support/BlockFrequencyTest.cpp b/llvm/unittests/Support/BlockFrequencyTest.cpp index ff66bc4..bcb88c8 100644 --- a/llvm/unittests/Support/BlockFrequencyTest.cpp +++ b/llvm/unittests/Support/BlockFrequencyTest.cpp @@ -8,11 +8,22 @@ using namespace llvm; namespace { +TEST(BlockFrequencyTest, ZeroToZero) { + BlockFrequency Freq(0); + BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), 0u); + + Freq = 1; + Freq *= BranchProbability::getZero(); + EXPECT_EQ(Freq.getFrequency(), 0u); +} + TEST(BlockFrequencyTest, OneToZero) { BlockFrequency Freq(1); BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX); Freq *= Prob; - EXPECT_EQ(Freq.getFrequency(), 0u); + EXPECT_EQ(Freq.getFrequency(), 1u); } TEST(BlockFrequencyTest, OneToOne) { -- cgit v1.1