Skip to content
  1. Nov 09, 2009
  2. Nov 05, 2009
  3. Nov 03, 2009
  4. Nov 02, 2009
  5. Oct 26, 2009
    • Dan Gohman's avatar
      When checking whether a def of an aliased register is dead, ask the · 9aba0d99
      Dan Gohman authored
      machineinstr whether the aliased register is dead, rather than the original
      register is dead. This allows it to get the correct answer when examining
      an instruction like this:
        CALLpcrel32 <ga:foo>, %AL<imp-def>, %EAX<imp-def,dead>
      where EAX is dead but a subregister of it is still live. This fixes PR5294.
      
      llvm-svn: 85135
      9aba0d99
  6. Oct 18, 2009
    • Evan Cheng's avatar
      Spill slots cannot alias. · f0236e01
      Evan Cheng authored
      llvm-svn: 84432
      f0236e01
    • Evan Cheng's avatar
      -Revert parts of 84326 and 84411. Distinquishing between fixed and non-fixed · 0e9d9ca8
      Evan Cheng authored
      stack slots and giving them different PseudoSourceValue's did not fix the
      problem of post-alloc scheduling miscompiling llvm itself.
      - Apply Dan's conservative workaround by assuming any non fixed stack slots can
      alias other memory locations. This means a load from spill slot #1 cannot 
      move above a store of spill slot #2. 
      - Enable post-alloc scheduling for x86 at optimization leverl Default and above.
      
      llvm-svn: 84424
      0e9d9ca8
  7. Oct 10, 2009
    • Dan Gohman's avatar
      Factor out LiveIntervalAnalysis' code to determine whether an instruction · 87b02d5b
      Dan Gohman authored
      is trivially rematerializable and integrate it into
      TargetInstrInfo::isTriviallyReMaterializable. This way, all places that
      need to know whether an instruction is rematerializable will get the
      same answer.
      
      This enables the useful parts of the aggressive-remat option by
      default -- using AliasAnalysis to determine whether a memory location
      is invariant, and removes the questionable parts -- rematting operations
      with virtual register inputs that may not be live everywhere.
      
      llvm-svn: 83687
      87b02d5b
  8. Oct 07, 2009
  9. Sep 25, 2009
    • Dan Gohman's avatar
      Improve MachineMemOperand handling. · 48b185d6
      Dan Gohman authored
       - Allocate MachineMemOperands and MachineMemOperand lists in MachineFunctions.
         This eliminates MachineInstr's std::list member and allows the data to be
         created by isel and live for the remainder of codegen, avoiding a lot of
         copying and unnecessary translation. This also shrinks MemSDNode.
       - Delete MemOperandSDNode. Introduce MachineSDNode which has dedicated
         fields for MachineMemOperands.
       - Change MemSDNode to have a MachineMemOperand member instead of its own
         fields with the same information. This introduces some redundancy, but
         it's more consistent with what MachineInstr will eventually want.
       - Ignore alignment when searching for redundant loads for CSE, but remember
         the greatest alignment.
      
      Target-specific code which previously used MemOperandSDNodes with generic
      SDNodes now use MemIntrinsicSDNodes, with opcodes in a designated range
      so that the SelectionDAG framework knows that MachineMemOperand information
      is available.
      
      llvm-svn: 82794
      48b185d6
  10. Sep 18, 2009
  11. Aug 19, 2009
  12. Aug 13, 2009
  13. Aug 10, 2009
  14. Aug 07, 2009
  15. Jul 17, 2009
  16. Jul 14, 2009
  17. Feb 11, 2009
    • Dan Gohman's avatar
      When scheduling a block in parts, keep track of the overall · dfaf646c
      Dan Gohman authored
      instruction index across each part. Instruction indices are used
      to make live range queries, and live ranges can extend beyond
      scheduling region boundaries.
      
      Refactor the ScheduleDAGSDNodes class some more so that it
      doesn't have to worry about this additional information.
      
      llvm-svn: 64288
      dfaf646c
    • Dan Gohman's avatar
      Factor out more code for computing register live-range informationfor · b9543435
      Dan Gohman authored
      scheduling, and generalize is so that preserves state across
      scheduling regions. This fixes incorrect live-range information around
      terminators and labels, which are effective region boundaries.
      
      In place of looking for terminators to anchor inter-block dependencies,
      introduce special entry and exit scheduling units for this purpose.
      
      llvm-svn: 64254
      b9543435
  18. Feb 06, 2009
  19. Jan 30, 2009
    • Dan Gohman's avatar
      Fix a post-RA scheduling dependency bug. · 1ee0d41e
      Dan Gohman authored
      If a MachineInstr doesn't have a memoperand but has an opcode that
      is known to load or store, assume its memory reference may alias
      *anything*, including stack slots which the compiler completely
      controls.
      
      To partially compensate for this, teach the ScheduleDAG building
      code to do basic getUnderlyingValue analysis. This greatly
      reduces the number of instructions that require restrictive
      dependencies. This code will need to be revisited when we start
      doing real alias analysis, but it should suffice for now.
      
      llvm-svn: 63370
      1ee0d41e
  20. Jan 16, 2009
    • Dan Gohman's avatar
      Instead of adding dependence edges between terminator instructions · 5f8a2598
      Dan Gohman authored
      and every other instruction in their blocks to keep the terminator
      instructions at the end, teach the post-RA scheduler how to operate
      on ranges of instructions, and exclude terminators from the range
      of instructions that get scheduled.
      
      Also, exclude mid-block labels, such as EH_LABEL instructions, and
      schedule code before them separately from code after them. This
      fixes problems with the post-RA scheduler moving code past
      EH_LABELs.
      
      llvm-svn: 62366
      5f8a2598
  21. Jan 15, 2009
    • Dan Gohman's avatar
      Move a few containers out of ScheduleDAGInstrs::BuildSchedGraph · 619ef48a
      Dan Gohman authored
      and into the ScheduleDAGInstrs class, so that they don't get
      destructed and re-constructed for each block. This fixes a
      compile-time hot spot in the post-pass scheduler.
      
      To help facilitate this, tidy and do some minor reorganization
      in the scheduler constructor functions.
      
      llvm-svn: 62275
      619ef48a
  22. Dec 23, 2008
    • Dan Gohman's avatar
      Clean up the atomic opcodes in SelectionDAG. · 12f24904
      Dan Gohman authored
      This removes all the _8, _16, _32, and _64 opcodes and replaces each
      group with an unsuffixed opcode. The MemoryVT field of the AtomicSDNode
      is now used to carry the size information. In tablegen, the size-specific
      opcodes are replaced by size-independent opcodes that utilize the
      ability to compose them with predicates.
      
      This shrinks the per-opcode tables and makes the code that handles
      atomics much more concise.
      
      llvm-svn: 61389
      12f24904
    • Dan Gohman's avatar
      Rename BuildSchedUnits to BuildSchedGraph, and refactor the · 04543e71
      Dan Gohman authored
      code in ScheduleDAGSDNodes' BuildSchedGraph into separate functions.
      
      llvm-svn: 61376
      04543e71
    • Dan Gohman's avatar
      Use isTerminator() instead of isBranch()||isReturn() in · 072e52f1
      Dan Gohman authored
      several places. isTerminator() returns true for a superset
      of cases, and includes things like FP_REG_KILL, which are
      nither return or branch but aren't safe to move/remat/etc.
      
      llvm-svn: 61373
      072e52f1
  23. Dec 16, 2008
  24. Dec 09, 2008
    • Dan Gohman's avatar
      Rewrite the SDep class, and simplify some of the related code. · 2d170896
      Dan Gohman authored
      The Cost field is removed. It was only being used in a very limited way,
      to indicate when the scheduler should attempt to protect a live register,
      and it isn't really needed to do that. If we ever want the scheduler to
      start inserting copies in non-prohibitive situations, we'll have to
      rethink some things anyway.
      
      A Latency field is added. Instead of giving each node a single
      fixed latency, each edge can have its own latency. This will eventually
      be used to model various micro-architecture properties more accurately.
      
      The PointerIntPair class and an internal union are now used, which
      reduce the overall size.
      
      llvm-svn: 60806
      2d170896
  25. Dec 08, 2008
  26. Dec 04, 2008
  27. Nov 24, 2008
  28. Nov 21, 2008
  29. Nov 20, 2008
    • Dan Gohman's avatar
      Treat mid-block labels the same as terminators when building the · 22e9677a
      Dan Gohman authored
      MachineInstr scheduling DAG, meaning they implicitly depend on all
      preceding defs. This fixes Benchmarks/Shootout-C++/except and
      Regression/C++/EH/simple_rethrow in
        -relocation-model=pic -disable-post-RA-scheduler=false
      mode.
      
      llvm-svn: 59747
      22e9677a
    • Dan Gohman's avatar
      Experimental post-pass scheduling support. Post-pass scheduling · 60cb69e6
      Dan Gohman authored
      is currently off by default, and can be enabled with
      -disable-post-RA-scheduler=false.
      
      This doesn't have a significant impact on most code yet because it doesn't
      yet do anything to address anti-dependencies and it doesn't attempt to
      disambiguate memory references. Also, several popular targets
      don't have pipeline descriptions yet.
      
      The majority of the changes here are splitting the SelectionDAG-specific
      code out of ScheduleDAG, so that ScheduleDAG can be moved to
      libLLVMCodeGen.a. The interface between ScheduleDAG-using code and
      the rest of the scheduling code is somewhat rough and will evolve.
      
      llvm-svn: 59676
      60cb69e6
Loading