Skip to content
  • Chandler Carruth's avatar
    Fix an overflow bug in MachineBranchProbabilityInfo. This pass relied on · ed5aa547
    Chandler Carruth authored
    the sum of the edge weights not overflowing uint32, and crashed when
    they did. This is generally safe as BranchProbabilityInfo tries to
    provide this guarantee. However, the CFG can get modified during codegen
    in a way that grows the *sum* of the edge weights. This doesn't seem
    unreasonable (imagine just adding more blocks all with the default
    weight of 16), but it is hard to come up with a case that actually
    triggers 32-bit overflow. Fortuately, the single-source GCC build is
    good at this. The solution isn't very pretty, but its no worse than the
    previous code. We're already summing all of the edge weights on each
    query, we can sum them, check for an overflow, compute a scale, and sum
    them again.
    
    I've included a *greatly* reduced test case out of the GCC source that
    triggers it. It's a pretty lame test, as it clearly is just barely
    triggering the overflow. I'd like to have something that is much more
    definitive, but I don't understand the fundamental pattern that triggers
    an explosion in the edge weight sums.
    
    The buggy code is duplicated within this file. I'll colapse them into
    a single implementation in a subsequent commit.
    
    llvm-svn: 144526
    ed5aa547
Loading