Skip to content
  1. Sep 14, 2012
  2. Sep 06, 2012
  3. Jul 26, 2012
    • Jakob Stoklund Olesen's avatar
      Start scaffolding for a MachineTraceMetrics analysis pass. · f9029fef
      Jakob Stoklund Olesen authored
      This is still a work in progress.
      
      Out-of-order CPUs usually execute instructions from multiple basic
      blocks simultaneously, so it is necessary to look at longer traces when
      estimating the performance effects of code transformations.
      
      The MachineTraceMetrics analysis will pick a typical trace through a
      given basic block and provide performance metrics for the trace. Metrics
      will include:
      
      - Instruction count through the trace.
      - Issue count per functional unit.
      - Critical path length, and per-instruction 'slack'.
      
      These metrics can be used to determine the performance limiting factor
      when executing the trace, and how it will be affected by a code
      transformation.
      
      Initially, this will be used by the early if-conversion pass.
      
      llvm-svn: 160796
      f9029fef
  4. Jul 04, 2012
    • Jakob Stoklund Olesen's avatar
      Add an experimental early if-conversion pass, off by default. · f8a63a15
      Jakob Stoklund Olesen authored
      This pass performs if-conversion on SSA form machine code by
      speculatively executing both sides of the branch and using a cmov
      instruction to select the result. This can help lower the number of
      branch mispredictions on architectures like x86 that don't have
      predicable instructions.
      
      The current implementation is very aggressive, and causes regressions on
      mosts tests. It needs good heuristics that have yet to be implemented.
      
      llvm-svn: 159694
      f8a63a15
  5. Jun 24, 2012
  6. Jun 21, 2012
  7. Jun 09, 2012
    • Jakob Stoklund Olesen's avatar
      Sketch a LiveRegMatrix analysis pass. · c26fbbfb
      Jakob Stoklund Olesen authored
      The LiveRegMatrix represents the live range of assigned virtual
      registers in a Live interval union per register unit. This is not
      fundamentally different from the interference tracking in RegAllocBase
      that both RABasic and RAGreedy use.
      
      The important differences are:
      
      - LiveRegMatrix tracks interference per register unit instead of per
        physical register. This makes interference checks cheaper and
        assignments slightly more expensive. For example, the ARM D7 reigster
        has 24 aliases, so we would check 24 physregs before assigning to one.
        With unit-based interference, we check 2 units before assigning to 2
        units.
      
      - LiveRegMatrix caches regmask interference checks. That is currently
        duplicated functionality in RABasic and RAGreedy.
      
      - LiveRegMatrix is a pass which makes it possible to insert
        target-dependent passes between register allocation and rewriting.
        Such passes could tweak the register assignments with interference
        checking support from LiveRegMatrix.
      
      Eventually, RABasic and RAGreedy will be switched to LiveRegMatrix.
      
      llvm-svn: 158255
      c26fbbfb
  8. Apr 24, 2012
  9. Mar 07, 2012
  10. Jan 13, 2012
  11. Jan 11, 2012
  12. Jan 07, 2012
    • Evan Cheng's avatar
      Added a late machine instruction copy propagation pass. This catches · 00b1a3cd
      Evan Cheng authored
      opportunities that only present themselves after late optimizations
      such as tail duplication .e.g.
      ## BB#1:
              movl    %eax, %ecx
              movl    %ecx, %eax
              ret
      
      The register allocator also leaves some of them around (due to false
      dep between copies from phi-elimination, etc.)
      
      This required some changes in codegen passes. Post-ra scheduler and the
      pseudo-instruction expansion passes have been moved after branch folding
      and tail merging. They were before branch folding before because it did
      not always update block livein's. That's fixed now. The pass change makes
      independently since we want to properly schedule instructions after
      branch folding / tail duplication.
      
      rdar://10428165
      rdar://10640363
      
      llvm-svn: 147716
      00b1a3cd
  13. Jan 05, 2012
  14. Dec 20, 2011
  15. Dec 15, 2011
  16. Dec 14, 2011
  17. Dec 06, 2011
  18. Dec 01, 2011
  19. Nov 29, 2011
  20. Nov 13, 2011
  21. Nov 12, 2011
  22. Oct 21, 2011
    • Chandler Carruth's avatar
      Implement a block placement pass based on the branch probability and · 10281425
      Chandler Carruth authored
      block frequency analyses. This differs substantially from the existing
      block-placement pass in LLVM:
      
      1) It operates on the Machine-IR in the CodeGen layer. This exposes much
         more (and more precise) information and opportunities. Also, the
         results are more stable due to fewer transforms ocurring after the
         pass runs.
      2) It uses the generalized probability and frequency analyses. These can
         model static heuristics, code annotation derived heuristics as well
         as eventual profile loading. By basing the optimization on the
         analysis interface it can work from any (or a combination) of these
         inputs.
      3) It uses a more aggressive algorithm, both building chains from tho
         bottom up to maximize benefit, and using an SCC-based walk to layout
         chains of blocks in a profitable ordering without O(N^2) iterations
         which the old pass involves.
      
      The pass is currently gated behind a flag, and not enabled by default
      because it still needs to grow some important features. Most notably, it
      needs to support loop aligning and careful layout of loop structures
      much as done by hand currently in CodePlacementOpt. Once it supports
      these, and has sufficient testing and quality tuning, it should replace
      both of these passes.
      
      Thanks to Nick Lewycky and Richard Smith for help authoring & debugging
      this, and to Jakob, Andy, Eric, Jim, and probably a few others I'm
      forgetting for reviewing and answering all my questions. Writing
      a backend pass is *sooo* much better now than it used to be. =D
      
      llvm-svn: 142641
      10281425
  23. Sep 28, 2011
  24. Sep 25, 2011
    • Jakob Stoklund Olesen's avatar
      Rename LowerSubregs to ExpandPostRAPseudos. · f152df1e
      Jakob Stoklund Olesen authored
      I'll fix the file contents in the next commit.
      
      This pass is currently expanding the COPY and SUBREG_TO_REG pseudos. I
      am going to add a hook so targets can expand more pseudo-instructions
      after register allocation.
      
      Many targets have pseudo-instructions that assist the register
      allocator.  They can be expanded after register allocation, before PEI
      and PostRA scheduling.
      
      llvm-svn: 140469
      f152df1e
  25. Sep 13, 2011
  26. Aug 10, 2011
  27. Jul 29, 2011
    • Chandler Carruth's avatar
      Rewrite the CMake build to use explicit dependencies between libraries, · 9d7feab3
      Chandler Carruth authored
      specified in the same file that the library itself is created. This is
      more idiomatic for CMake builds, and also allows us to correctly specify
      dependencies that are missed due to bugs in the GenLibDeps perl script,
      or change from compiler to compiler. On Linux, this returns CMake to
      a place where it can relably rebuild several targets of LLVM.
      
      I have tried not to change the dependencies from the ones in the current
      auto-generated file. The only places I've really diverged are in places
      where I was seeing link failures, and added a dependency. The goal of
      this patch is not to start changing the dependencies, merely to move
      them into the correct location, and an explicit form that we can control
      and change when necessary.
      
      This also removes a serialization point in the build because we don't
      have to scan all the libraries before we begin building various tools.
      We no longer have a step of the build that regenerates a file inside the
      source tree. A few other associated cleanups fall out of this.
      
      This isn't really finished yet though. After talking to dgregor he urged
      switching to a single CMake macro to construct libraries with both
      sources and dependencies in the arguments. Migrating from the two macros
      to that style will be a follow-up patch.
      
      Also, llvm-config is still generated with GenLibDeps.pl, which means it
      still has slightly buggy dependencies. The internal CMake
      'llvm-config-like' macro uses the correct explicitly specified
      dependencies however. A future patch will switch llvm-config generation
      (when using CMake) to be based on these deps as well.
      
      This may well break Windows. I'm getting a machine set up now to dig
      into any failures there. If anyone can chime in with problems they see
      or ideas of how to solve them for Windows, much appreciated.
      
      llvm-svn: 136433
      9d7feab3
  28. Jul 25, 2011
  29. Jul 16, 2011
  30. Jun 28, 2011
  31. Jun 27, 2011
  32. Jun 16, 2011
  33. Jun 02, 2011
    • Jakob Stoklund Olesen's avatar
      Add a RegisterClassInfo class that lazily caches information about · c58894bc
      Jakob Stoklund Olesen authored
      register classes.
      
      It provides information for each register class that cannot be
      determined statically, like:
      
      - The number of allocatable registers in a class after filtering out the
        reserved and invalid registers.
      
      - The preferred allocation order with registers that overlap callee-saved
        registers last.
      
      - The last callee-saved register that overlaps a given physical register.
      
      This information usually doesn't change between functions, so it is
      reused for compiling multiple functions when possible.  The many
      possible combinations of reserved and callee saves registers makes it
      unfeasible to compute this information statically in TableGen.
      
      Use RegisterClassInfo to count available registers in various heuristics
      in SimpleRegisterCoalescing, making the pass run 4% faster.
      
      llvm-svn: 132450
      c58894bc
  34. Apr 02, 2011
  35. Feb 18, 2011
  36. Jan 09, 2011
  37. Jan 06, 2011
    • Jakob Stoklund Olesen's avatar
      Add the SpillPlacement analysis pass. · 8e236eac
      Jakob Stoklund Olesen authored
      This pass precomputes CFG block frequency information that can be used by the
      register allocator to find optimal spill code placement.
      
      Given an interference pattern, placeSpills() will compute which basic blocks
      should have the current variable enter or exit in a register, and which blocks
      prefer the stack.
      
      The algorithm is ready to consume block frequencies from profiling data, but for
      now it gets by with the static estimates used for spill weights.
      
      This is a work in progress and still not hooked up to RegAllocGreedy.
      
      llvm-svn: 122938
      8e236eac
  38. Jan 04, 2011
  39. Dec 16, 2010
    • Jakob Stoklund Olesen's avatar
      Add MachineLoopRanges analysis. · 5e977813
      Jakob Stoklund Olesen authored
      A MachineLoopRange contains the intervals of slot indexes covered by the blocks
      in a loop. This representation of the loop blocks is more efficient to compare
      against interfering registers during register coalescing.
      
      llvm-svn: 121917
      5e977813
Loading