Skip to content
  1. Sep 04, 2008
  2. Jul 27, 2008
  3. Jun 08, 2008
    • Duncan Sands's avatar
      Remove comparison methods for MVT. The main cause · 11dd4245
      Duncan Sands authored
      of apint codegen failure is the DAG combiner doing
      the wrong thing because it was comparing MVT's using
      < rather than comparing the number of bits.  Removing
      the < method makes this mistake impossible to commit.
      Instead, add helper methods for comparing bits and use
      them.
      
      llvm-svn: 52098
      11dd4245
  4. Jun 06, 2008
    • Duncan Sands's avatar
      Wrap MVT::ValueType in a struct to get type safety · 13237ac3
      Duncan Sands authored
      and better control the abstraction.  Rename the type
      to MVT.  To update out-of-tree patches, the main
      thing to do is to rename MVT::ValueType to MVT, and
      rewrite expressions like MVT::getSizeInBits(VT) in
      the form VT.getSizeInBits().  Use VT.getSimpleVT()
      to extract a MVT::SimpleValueType for use in switch
      statements (you will get an assert failure if VT is
      an extended value type - these shouldn't exist after
      type legalization).
      This results in a small speedup of codegen and no
      new testsuite failures (x86-64 linux).
      
      llvm-svn: 52044
      13237ac3
  5. May 23, 2008
  6. May 16, 2008
  7. May 13, 2008
  8. May 08, 2008
  9. Apr 27, 2008
    • Chris Lattner's avatar
      Implement a signficant optimization for inline asm: · 22379734
      Chris Lattner authored
      When choosing between constraints with multiple options,
      like "ir", test to see if we can use the 'i' constraint and
      go with that if possible.  This produces more optimal ASM in
      all cases (sparing a register and an instruction to load it),
      and fixes inline asm like this:
      
      void test () {
        asm volatile (" %c0 %1 " : : "imr" (42), "imr"(14));
      }
      
      Previously we would dump "42" into a memory location (which
      is ok for the 'm' constraint) which would cause a problem
      because the 'c' modifier is not valid on memory operands.
      
      Isn't it great how inline asm turns 'missed optimization'
      into 'compile failed'??
      
      Incidentally, this was the todo in 
      PowerPC/2007-04-24-InlineAsm-I-Modifier.ll
      
      Please do NOT pull this into Tak.
      
      llvm-svn: 50315
      22379734
    • Chris Lattner's avatar
      Move a bunch of inline asm code out of line. · 4793515a
      Chris Lattner authored
      llvm-svn: 50313
      4793515a
  10. Apr 25, 2008
    • Dan Gohman's avatar
      Remove the code from CodeGenPrepare that moved getresult instructions · ca95a5f4
      Dan Gohman authored
      to the block that defines their operands. This doesn't work in the
      case that the operand is an invoke, because invoke is a terminator
      and must be the last instruction in a block.
      
      Replace it with support in SelectionDAGISel for copying struct values
      into sequences of virtual registers.
      
      llvm-svn: 50279
      ca95a5f4
  11. Apr 06, 2008
  12. Mar 21, 2008
  13. Mar 19, 2008
  14. Feb 26, 2008
  15. Jan 20, 2008
  16. Dec 29, 2007
  17. Dec 25, 2007
  18. Dec 24, 2007
  19. Dec 13, 2007
  20. Dec 12, 2007
  21. Dec 06, 2007
  22. Nov 06, 2007
  23. Nov 01, 2007
    • Duncan Sands's avatar
      Executive summary: getTypeSize -> getTypeStoreSize / getABITypeSize. · 44b8721d
      Duncan Sands authored
      The meaning of getTypeSize was not clear - clarifying it is important
      now that we have x86 long double and arbitrary precision integers.
      The issue with long double is that it requires 80 bits, and this is
      not a multiple of its alignment.  This gives a primitive type for
      which getTypeSize differed from getABITypeSize.  For arbitrary precision
      integers it is even worse: there is the minimum number of bits needed to
      hold the type (eg: 36 for an i36), the maximum number of bits that will
      be overwriten when storing the type (40 bits for i36) and the ABI size
      (i.e. the storage size rounded up to a multiple of the alignment; 64 bits
      for i36).
      
      This patch removes getTypeSize (not really - it is still there but
      deprecated to allow for a gradual transition).  Instead there is:
      
      (1) getTypeSizeInBits - a number of bits that suffices to hold all
      values of the type.  For a primitive type, this is the minimum number
      of bits.  For an i36 this is 36 bits.  For x86 long double it is 80.
      This corresponds to gcc's TYPE_PRECISION.
      
      (2) getTypeStoreSizeInBits - the maximum number of bits that is
      written when storing the type (or read when reading it).  For an
      i36 this is 40 bits, for an x86 long double it is 80 bits.  This
      is the size alias analysis is interested in (getTypeStoreSize
      returns the number of bytes).  There doesn't seem to be anything
      corresponding to this in gcc.
      
      (3) getABITypeSizeInBits - this is getTypeStoreSizeInBits rounded
      up to a multiple of the alignment.  For an i36 this is 64, for an
      x86 long double this is 96 or 128 depending on the OS.  This is the
      spacing between consecutive elements when you form an array out of
      this type (getABITypeSize returns the number of bytes).  This is
      TYPE_SIZE in gcc.
      
      Since successive elements in a SequentialType (arrays, pointers
      and vectors) need to be aligned, the spacing between them will be
      given by getABITypeSize.  This means that the size of an array
      is the length times the getABITypeSize.  It also means that GEP
      computations need to use getABITypeSize when computing offsets.
      Furthermore, if an alloca allocates several elements at once then
      these too need to be aligned, so the size of the alloca has to be
      the number of elements multiplied by getABITypeSize.  Logically
      speaking this doesn't have to be the case when allocating just
      one element, but it is simpler to also use getABITypeSize in this
      case.  So alloca's and mallocs should use getABITypeSize.  Finally,
      since gcc's only notion of size is that given by getABITypeSize, if
      you want to output assembler etc the same as gcc then getABITypeSize
      is the size you want.
      
      Since a store will overwrite no more than getTypeStoreSize bytes,
      and a read will read no more than that many bytes, this is the
      notion of size appropriate for alias analysis calculations.
      
      In this patch I have corrected all type size uses except some of
      those in ScalarReplAggregates, lib/Codegen, lib/Target (the hard
      cases).  I will get around to auditing these too at some point,
      but I could do with some help.
      
      Finally, I made one change which I think wise but others might
      consider pointless and suboptimal: in an unpacked struct the
      amount of space allocated for a field is now given by the ABI
      size rather than getTypeStoreSize.  I did this because every
      other place that reserves memory for a type (eg: alloca) now
      uses getABITypeSize, and I didn't want to make an exception
      for unpacked structs, i.e. I did it to make things more uniform.
      This only effects structs containing long doubles and arbitrary
      precision integers.  If someone wants to pack these types more
      tightly they can always use a packed struct.
      
      llvm-svn: 43620
      44b8721d
  24. Aug 02, 2007
  25. Aug 01, 2007
  26. Jun 12, 2007
  27. May 08, 2007
  28. May 06, 2007
  29. May 03, 2007
  30. May 02, 2007
  31. May 01, 2007
  32. Apr 25, 2007
  33. Apr 14, 2007
  34. Apr 13, 2007
    • Chris Lattner's avatar
      Completely rewrite addressing-mode related sinking of code. In particular, · feee64e9
      Chris Lattner authored
      this fixes problems where codegenprepare would sink expressions into load/stores
      that are not valid, and fixes cases where it would miss important valid ones.
      
      This fixes several serious codesize and perf issues, particularly on targets
      with complex addressing modes like arm and x86.  For example, now we compile
      CodeGen/X86/isel-sink.ll to:
      
      _test:
              movl 8(%esp), %eax
              movl 4(%esp), %ecx
              cmpl $1233, %eax
              ja LBB1_2       #F
      LBB1_1: #T
              movl $4, (%ecx,%eax,4)
              movl $141, %eax
              ret
      LBB1_2: #F
              movl (%ecx,%eax,4), %eax
              ret
      
      instead of:
      
      _test:
              movl 8(%esp), %eax
              leal (,%eax,4), %ecx
              addl 4(%esp), %ecx
              cmpl $1233, %eax
              ja LBB1_2       #F
      LBB1_1: #T
              movl $4, (%ecx)
              movl $141, %eax
              ret
      LBB1_2: #F
              movl (%ecx), %eax
              ret
      
      llvm-svn: 35970
      feee64e9
  35. Apr 10, 2007
Loading