[LLVMbugs] [Bug 20316] New: Expose a block "bias" metric from BlockFrequencyInfo

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Jul 15 19:29:04 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=20316

            Bug ID: 20316
           Summary: Expose a block "bias" metric from BlockFrequencyInfo
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Global Analyses
          Assignee: unassignedbugs at nondot.org
          Reporter: dexonsmith at apple.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Chandler and Diego highlighted a few places that "block frequency" is hard to
use (see http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-February/069963.html
and follow-ups).

As part of rewriting BFI, I mapped out a plan for a exposing a "bias" metric as
a second output.

While block frequency measures how often a block is likely to be executed
compared to an arbitrary reference point -- used by comparing against the block
frequency of a "section" entry block (like the function entry or loop header)
-- block bias measures how much more (or less) likely a block is to be executed
than its "competing" branches.

Here's the idea of bias:

 1. Calculate block frequency normally.

 2. In parallel, calculate a "reference" block frequency for every block, which
represents an unbiased block frequency.

 3. Take the ratio of the two, and call it the block bias.

The reference block frequency calculations assume that all branch weights are
even.  E.g., if a block has three successor edges, then each edge has a
probability of 1/3.  If a block has five successor edges and two of them go to
the same block, the effective probability for that successor is 2/5.

Furthermore, the reference block frequency is not scaled up by the expected
number of loop iterations.

The result is that for code like this:

define void @loop_with_branch(i32 %a) {
entry:
  %skip_loop = call i1 @foo0(i32 %a)
  br i1 %skip_loop, label %skip, label %header, !prof !0

skip:
  br label %exit

header:
  %i = phi i32 [ 0, %entry ], [ %i.next, %back ]
  %i.next = add i32 %i, 1
  %choose = call i2 @foo1(i32 %i)
  switch i2 %choose, label %exit [ i2 0, label %left
                                   i2 1, label %right ], !prof !1

left:
  br label %back

right:
  br label %back

back:
  br label %header

exit:
  ret void
}
!0 = metadata !{metadata !"branch_weights", i32 1, i32 3}
!1 = metadata !{metadata !"branch_weights", i32 1, i32 2, i32 3}

We get freq[uency], ref[erence frequency], and bias like this:

 - entry:  freq = 1.0,  ref = 1.0,          bias = 1.0
 - header: freq = 4.5,  ref = 0.5,          bias = 9.0
 - right:  freq = 2.25, ref = 0.1666666667, bias = 13.5
 - left:   freq = 1.5,  ref = 0.1666666667, bias = 9.0
 - back:   freq = 3.75, ref = 0.3333333333, bias = 11.25
 - skip:   freq = 0.25, ref = 0.5,          bias = 0.5
 - exit:   freq = 1.0,  ref = 1.0,          bias = 1.0

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140716/f957ef80/attachment.html>


More information about the llvm-bugs mailing list