Skip to content
  1. Nov 20, 2011
    • Chandler Carruth's avatar
      The logic for breaking the CFG in the presence of hot successors didn't · 18dfac38
      Chandler Carruth authored
      properly account for the *global* probability of the edge being taken.
      This manifested as a very large number of unconditional branches to
      blocks being merged against the CFG even though they weren't
      particularly hot within the CFG.
      
      The fix is to check whether the edge being merged is both locally hot
      relative to other successors for the source block, and globally hot
      compared to other (unmerged) predecessors of the destination block.
      
      This introduces a new crasher on GCC single-source, but it's currently
      behind a flag, and Ben has offered to work on the reduction. =]
      
      llvm-svn: 145010
      18dfac38
  2. Nov 19, 2011
    • Chandler Carruth's avatar
      Move the handling of unanalyzable branches out of the loop-driven chain · f3dc9eff
      Chandler Carruth authored
      formation phase and into the initial walk of the basic blocks. We
      essentially pre-merge all blocks where unanalyzable fallthrough exists,
      as we won't be able to update the terminators effectively after any
      reorderings. This is quite a bit more principled as there may be CFGs
      where the second half of the unanalyzable pair has some analyzable
      predecessor that gets placed first. Then it may get placed next,
      implicitly breaking the unanalyzable branch even though we never even
      looked at the part that isn't analyzable. I've included a test case that
      triggers this (thanks Benjamin yet again!), and I'm hoping to synthesize
      some more general ones as I dig into related issues.
      
      Also, to make this new scheme work we have to be able to handle branches
      into the middle of a chain, so add this check. We always fallback on the
      incoming ordering.
      
      Finally, this starts to really underscore a known limitation of the
      current implementation -- we don't consider broken predecessors when
      merging successors. This can caused major missed opportunities, and is
      something I'm planning on looking at next (modulo more bug reports).
      
      llvm-svn: 144994
      f3dc9eff
  3. Nov 18, 2011
  4. Nov 17, 2011
    • Chad Rosier's avatar
      When fast iseling a GEP, accumulate the offset rather than emitting a series of · f83ab704
      Chad Rosier authored
      ADDs.  MaxOffs is used as a threshold to limit the size of the offset. Tradeoffs
      being: (1) If we can't materialize the large constant then we'll cause fast-isel
      to bail. (2) Too large of an offset can't be directly encoded in the ADD
      resulting in a MOV+ADD.  Generally not a bad thing because otherwise we would
      have had ADD+ADD, but on Thumb this turns into a MOVS+MOVT+ADD. Working on a fix
      for that. (3) Conversely, too low of a threshold we'll miss opportunities to 
      coalesce ADDs.
      rdar://10412592
      
      llvm-svn: 144886
      f83ab704
    • Eli Friedman's avatar
      Make sure to replace the chain properly when DAGCombining a... · ff1eaa75
      Eli Friedman authored
      Make sure to replace the chain properly when DAGCombining a LOAD+EXTRACT_VECTOR_ELT into a single LOAD.  Fixes PR10747/PR11393.
      
      llvm-svn: 144863
      ff1eaa75
  5. Nov 16, 2011
  6. Nov 15, 2011
  7. Nov 14, 2011
Loading