Skip to content
  1. Nov 14, 2011
    • Chandler Carruth's avatar
      Remove an over-eager assert that was firing on one of the ARM regression · 0a31d149
      Chandler Carruth authored
      tests when I forcibly enabled block placement.
      
      It is apparantly possible for an unanalyzable block to fallthrough to
      a non-loop block. I don't actually beleive this is correct, I believe
      that 'canFallThrough' is returning true needlessly for the code
      construct, and I've left a bit of a FIXME on the verification code to
      try to track down why this is coming up.
      
      Anyways, removing the assert doesn't degrade the correctness of the algorithm.
      
      llvm-svn: 144532
      0a31d149
    • Chandler Carruth's avatar
      Begin chipping away at one of the biggest quadratic-ish behaviors in · 0af6a0bb
      Chandler Carruth authored
      this pass. We're leaving already merged blocks on the worklist, and
      scanning them again and again only to determine each time through that
      indeed they aren't viable. We can instead remove them once we're going
      to have to scan the worklist. This is the easy way to implement removing
      them. If this remains on the profile (as I somewhat suspect it will), we
      can get a lot more clever here, as the worklist's order is essentially
      irrelevant. We can use swapping and fold the two loops to reduce
      overhead even when there are many blocks on the worklist but only a few
      of them are removed.
      
      llvm-svn: 144531
      0af6a0bb
    • Chandler Carruth's avatar
      Under the hood, MBPI is doing a linear scan of every successor every · 84cd44c7
      Chandler Carruth authored
      time it is queried to compute the probability of a single successor.
      This makes computing the probability of every successor of a block in
      sequence... really really slow. ;] This switches to a linear walk of the
      successors rather than a quadratic one. One of several quadratic
      behaviors slowing this pass down.
      
      I'm not really thrilled with moving the sum code into the public
      interface of MBPI, but I don't (at the moment) have ideas for a better
      interface. My direction I'm thinking in for a better interface is to
      have MBPI actually retain much more state and make *all* of these
      queries cheap. That's a lot of work, and would require invasive changes.
      Until then, this seems like the least bad (ie, least quadratic)
      solution. Suggestions welcome.
      
      llvm-svn: 144530
      84cd44c7
    • Chandler Carruth's avatar
      Reuse the logic in getEdgeProbability within getHotSucc in order to · a9e71faa
      Chandler Carruth authored
      correctly handle blocks whose successor weights sum to more than
      UINT32_MAX. This is slightly less efficient, but the entire thing is
      already linear on the number of successors. Calling it within any hot
      routine is a mistake, and indeed no one is calling it. It also
      simplifies the code.
      
      llvm-svn: 144527
      a9e71faa
    • 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
    • Jakob Stoklund Olesen's avatar
      Use getVNInfoBefore() when it makes sense. · d7bcf43d
      Jakob Stoklund Olesen authored
      llvm-svn: 144517
      d7bcf43d
    • Chandler Carruth's avatar
      Teach machine block placement to cope with unnatural loops. These don't · 1071cfa4
      Chandler Carruth authored
      get loop info structures associated with them, and so we need some way
      to make forward progress selecting and placing basic blocks. The
      technique used here is pretty brutal -- it just scans the list of blocks
      looking for the first unplaced candidate. It keeps placing blocks like
      this until the CFG becomes tractable.
      
      The cost is somewhat unfortunate, it requires allocating a vector of all
      basic block pointers eagerly. I have some ideas about how to simplify
      and optimize this, but I'm trying to get the logic correct first.
      
      Thanks to Benjamin Kramer for the reduced test case out of GCC. Sadly
      there are other bugs that GCC is tickling that I'm reducing and working
      on now.
      
      llvm-svn: 144516
      1071cfa4
    • Jakob Stoklund Olesen's avatar
      Use kill slots instead of the previous slot in shrinkToUses. · 69797902
      Jakob Stoklund Olesen authored
      It's more natural to use the actual end points.
      
      llvm-svn: 144515
      69797902
  2. Nov 13, 2011
  3. Nov 12, 2011
  4. Nov 11, 2011
  5. Nov 10, 2011
Loading