Skip to content
  • Jakob Stoklund Olesen's avatar
    Reapply r134047 now that the world is ready for it. · adc6a4ca
    Jakob Stoklund Olesen authored
    This patch will sometimes choose live range split points next to
    interference instead of always splitting next to a register point. That
    means spill code can now appear almost anywhere, and it was necessary
    to fix code that didn't expect that.
    
    The difficult places were:
    
    - Between a CALL returning a value on the x87 stack and the
      corresponding FpPOP_RETVAL (was FpGET_ST0). Probably also near x87
      inline assembly, but that didn't actually show up in testing.
    
    - Between a CALL popping arguments off the stack and the corresponding
      ADJCALLSTACKUP.
    
    Both are fixed now. The only place spill code can't appear is after
    terminators, see SplitAnalysis::getLastSplitPoint.
    
    Original commit message:
    
    Rewrite RAGreedy::splitAroundRegion, now with cool ASCII art.
    
    This function has to deal with a lot of special cases, and the old
    version got it wrong sometimes. In particular, it would sometimes leave
    multiple uses in the stack interval in a single block. That causes bad
    code with multiple reloads in the same basic block.
    
    The new version handles block entry and exit in a single pass. It first
    eliminates all the easy cases, and then goes on to create a local
    interval for the blocks with difficult interference. Previously, we
    would only create the local interval for completely isolated blocks.
    
    It can happen that the stack interval becomes completely empty because
    we could allocate a register in all edge bundles, and the new local
    intervals deal with the interference. The empty stack interval is
    harmless, but we need to remove a SplitKit assertion that checks for
    empty intervals.
    
    llvm-svn: 134125
    adc6a4ca
Loading