Skip to content
  1. Dec 02, 2008
  2. Nov 26, 2008
  3. Nov 18, 2008
  4. Oct 27, 2008
  5. Oct 25, 2008
  6. Oct 21, 2008
    • Dan Gohman's avatar
      Optimized FCMP_OEQ and FCMP_UNE for x86. · 97d95d6d
      Dan Gohman authored
      Where previously LLVM might emit code like this:
      
              ucomisd %xmm1, %xmm0
              setne   %al
              setp    %cl
              orb     %al, %cl
              jne     .LBB4_2
      
      it now emits this:
      
              ucomisd %xmm1, %xmm0
              jne     .LBB4_2
              jp      .LBB4_2
      
      It has fewer instructions and uses fewer registers, but it does
      have more branches. And in the case that this code is followed by
      a non-fallthrough edge, it may be followed by a jmp instruction,
      resulting in three branch instructions in sequence. Some effort
      is made to avoid this situation.
      
      To achieve this, X86ISelLowering.cpp now recognizes FCMP_OEQ and
      FCMP_UNE in lowered form, and replace them with code that emits
      two branches, except in the case where it would require converting
      a fall-through edge to an explicit branch.
      
      Also, X86InstrInfo.cpp's branch analysis and transform code now
      knows now to handle blocks with multiple conditional branches. It
      uses loops instead of having fixed checks for up to two
      instructions. It can now analyze and transform code generated
      from FCMP_OEQ and FCMP_UNE.
      
      llvm-svn: 57873
      97d95d6d
    • Dan Gohman's avatar
      When the coalescer is doing rematerializing, have it remove · c835458d
      Dan Gohman authored
      the copy instruction from the instruction list before asking the
      target to create the new instruction. This gets the old instruction
      out of the way so that it doesn't interfere with the target's
      rematerialization code. In the case of x86, this helps it find
      more cases where EFLAGS is not live.
      
      Also, in the X86InstrInfo.cpp, teach isSafeToClobberEFLAGS to check
      to see if it reached the end of the block after scanning each
      instruction, instead of just before. This lets it notice when the
      end of the block is only two instructions away, without doing any
      additional scanning.
      
      These changes allow rematerialization to clobber EFLAGS in more
      cases, for example using xor instead of mov to set the return value
      to zero in the included testcase.
      
      llvm-svn: 57872
      c835458d
  7. Oct 17, 2008
    • Dan Gohman's avatar
      Define patterns for shld and shrd that match immediate · a39b0a1f
      Dan Gohman authored
      shift counts, and patterns that match dynamic shift counts
      when the subtract is obscured by a truncate node.
      
      Add DAGCombiner support for recognizing rotate patterns
      when the shift counts are defined by truncate nodes.
      
      Fix and simplify the code for commuting shld and shrd
      instructions to work even when the given instruction doesn't
      have a parent, and when the caller needs a new instruction.
      
      These changes allow LLVM to use the shld, shrd, rol, and ror
      instructions on x86 to replace equivalent code using two
      shifts and an or in many more cases.
      
      llvm-svn: 57662
      a39b0a1f
  8. Oct 16, 2008
  9. Oct 12, 2008
  10. Oct 04, 2008
  11. Oct 03, 2008
  12. Sep 30, 2008
  13. Sep 26, 2008
  14. Sep 23, 2008
  15. Sep 13, 2008
    • Dan Gohman's avatar
      Remove isImm(), isReg(), and friends, in favor of · 38453eeb
      Dan Gohman authored
      isImmediate(), isRegister(), and friends, to avoid confusion
      about having two different names with the same meaning. I'm
      not attached to the longer names, and would be ok with
      changing to the shorter names if others prefer it.
      
      llvm-svn: 56189
      38453eeb
  16. Aug 30, 2008
  17. Aug 29, 2008
  18. Aug 26, 2008
  19. Aug 15, 2008
  20. Aug 08, 2008
  21. Aug 07, 2008
    • Dan Gohman's avatar
      Re-enable elimination of unnecessary SUBREG_TO_REG instructions in · 527ca7e2
      Dan Gohman authored
      LowerSubregs, and fix an x86-64 isel bug that this exposed.
      
      SUBREG_TO_REG for x86-64 implicit zero extension is only safe for
      isel to generate when the source is known to always have zeros in
      the high 32 bits. The EXTRACT_SUBREG instruction does not clear
      the high 32 bits.
      
      llvm-svn: 54444
      527ca7e2
  22. Jul 27, 2008
  23. Jul 21, 2008
  24. Jul 19, 2008
  25. Jul 17, 2008
    • Dan Gohman's avatar
      Add a new function, ReplaceAllUsesOfValuesWith, which handles bulk · 17059681
      Dan Gohman authored
      replacement of multiple values. This is slightly more efficient
      than doing multiple ReplaceAllUsesOfValueWith calls, and theoretically
      could be optimized even further. However, an important property of this
      new function is that it handles the case where the source value set and
      destination value set overlap. This makes it feasible for isel to use
      SelectNodeTo in many very common cases, which is advantageous because
      SelectNodeTo avoids a temporary node and it doesn't require CSEMap
      updates for users of values that don't change position.
      
      Revamp MorphNodeTo, which is what does all the work of SelectNodeTo, to
      handle operand lists more efficiently, and to correctly handle a number
      of corner cases to which its new wider use exposes it.
      
      This commit also includes a change to the encoding of post-isel opcodes
      in SDNodes; now instead of being sandwiched between the target-independent
      pre-isel opcodes and the target-dependent pre-isel opcodes, post-isel
      opcodes are now represented as negative values. This makes it possible
      to test if an opcode is pre-isel or post-isel without having to know
      the size of the current target's post-isel instruction set.
      
      These changes speed up llc overall by 3% and reduce memory usage by 10%
      on the InstructionCombining.cpp testcase with -fast and -regalloc=local.
      
      llvm-svn: 53728
      17059681
  26. Jul 12, 2008
  27. Jul 08, 2008
    • Dan Gohman's avatar
      Pool-allocation for MachineInstrs, MachineBasicBlocks, and · 3b460303
      Dan Gohman authored
      MachineMemOperands. The pools are owned by MachineFunctions.
      
      This drastically reduces the number of calls to malloc/free made
      during the "Emit" phase of scheduling, as well as later phases
      in CodeGen. Combined with other changes, this speeds up the
      "instruction selection" phase of CodeGen by 10% in some cases.
      
      llvm-svn: 53212
      3b460303
  28. Jul 07, 2008
  29. Jul 03, 2008
  30. Jul 01, 2008
    • Dan Gohman's avatar
      Split ISD::LABEL into ISD::DBG_LABEL and ISD::EH_LABEL, eliminating · fb19f940
      Dan Gohman authored
      the need for a flavor operand, and add a new SDNode subclass,
      LabelSDNode, for use with them to eliminate the need for a label id
      operand.
      
      Change instruction selection to let these label nodes through
      unmodified instead of creating copies of them. Teach the MachineInstr
      emitter how to emit a MachineInstr directly from an ISD label node.
      
      This avoids the need for allocating SDNodes for the label id and
      flavor value, as well as SDNodes for each of the post-isel label,
      label id, and label flavor.
      
      llvm-svn: 52943
      fb19f940
  31. Jun 24, 2008
Loading