Skip to content
  1. Jun 13, 2008
    • Duncan Sands's avatar
      Disable some DAG combiner optimizations that may be · 8651e9c5
      Duncan Sands authored
      wrong for volatile loads and stores.  In fact this
      is almost all of them!  There are three types of
      problems: (1) it is wrong to change the width of
      a volatile memory access.  These may be used to
      do memory mapped i/o, in which case a load can have
      an effect even if the result is not used.  Consider
      loading an i32 but only using the lower 8 bits.  It
      is wrong to change this into a load of an i8, because
      you are no longer tickling the other three bytes.  It
      is also unwise to make a load/store wider.  For
      example, changing an i16 load into an i32 load is
      wrong no matter how aligned things are, since the
      fact of loading an additional 2 bytes can have
      i/o side-effects.  (2) it is wrong to change the
      number of volatile load/stores: they may be counted
      by the hardware.  (3) it is wrong to change a volatile
      load/store that requires one memory access into one
      that requires several.  For example on x86-32, you
      can store a double in one processor operation, but to
      store an i64 requires two (two i32 stores).  In a
      multi-threaded program you may want to bitcast an i64
      to a double and store as a double because that will
      occur atomically, and be indivisible to other threads.
      So it would be wrong to convert the store-of-double
      into a store of an i64, because this will become two
      i32 stores - no longer atomic.  My policy here is
      to say that the number of processor operations for
      an illegal operation is undefined.  So it is alright
      to change a store of an i64 (requires at least two
      stores; but could be validly lowered to memcpy for
      example) into a store of double (one processor op).
      In short, if the new store is legal and has the same
      size then I say that the transform is ok.  It would
      also be possible to say that transforms are always
      ok if before they were illegal, whether after they
      are illegal or not, but that's more awkward to do
      and I doubt it buys us anything much.
      However this exposed an interesting thing - on x86-32
      a store of i64 is considered legal!  That is because
      operations are marked legal by default, regardless of
      whether the type is legal or not.  In some ways this
      is clever: before type legalization this means that
      operations on illegal types are considered legal;
      after type legalization there are no illegal types
      so now operations are only legal if they really are.
      But I consider this to be too cunning for mere mortals.
      Better to do things explicitly by testing AfterLegalize.
      So I have changed things so that operations with illegal
      types are considered illegal - indeed they can never
      map to a machine operation.  However this means that
      the DAG combiner is more conservative because before
      it was "accidentally" performing transforms where the
      type was illegal because the operation was nonetheless
      marked legal.  So in a few such places I added a check
      on AfterLegalize, which I suppose was actually just
      forgotten before.  This causes the DAG combiner to do
      slightly more than it used to, which resulted in the X86
      backend blowing up because it got a slightly surprising
      node it wasn't expecting, so I tweaked it.
      
      llvm-svn: 52254
      8651e9c5
  2. Jun 11, 2008
  3. Jun 09, 2008
  4. Jun 08, 2008
  5. Jun 07, 2008
  6. Jun 06, 2008
  7. Jun 04, 2008
    • Chris Lattner's avatar
      Rewrite a bunch of the CBE's inline asm code, giving it the · c596ec04
      Chris Lattner authored
      ability to handle indirect input operands.  This fixes PR2407.
      
      llvm-svn: 51952
      c596ec04
    • Duncan Sands's avatar
      Change packed struct layout so that field sizes · fc3c489b
      Duncan Sands authored
      are the same as in unpacked structs, only field
      positions differ.  This only matters for structs
      containing x86 long double or an apint; it may
      cause backwards compatibility problems if someone
      has bitcode containing a packed struct with a
      field of one of those types.
      The issue is that only 10 bytes are needed to
      hold an x86 long double: the store size is 10
      bytes, but the ABI size is 12 or 16 bytes (linux/
      darwin) which comes from rounding the store size
      up by the alignment.  Because it seemed silly not
      to pack an x86 long double into 10 bytes in a
      packed struct, this is what was done.  I now
      think this was a mistake.  Reserving the ABI size
      for an x86 long double field even in a packed
      struct makes things more uniform: the ABI size is
      now always used when reserving space for a type.
      This means that developers are less likely to
      make mistakes.  It also makes life easier for the
      CBE which otherwise could not represent all LLVM
      packed structs (PR2402).
      Front-end people might need to adjust the way
      they create LLVM structs - see following change
      to llvm-gcc.
      
      llvm-svn: 51928
      fc3c489b
    • Bruno Cardoso Lopes's avatar
      Some Mips minor fixes · 326a0373
      Bruno Cardoso Lopes authored
      Added support for mips little endian arch => mipsel
      
      llvm-svn: 51923
      326a0373
  8. Jun 03, 2008
  9. Jun 02, 2008
  10. Jun 01, 2008
  11. May 31, 2008
  12. May 30, 2008
  13. May 29, 2008
Loading