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
    • 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
  5. 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
    • Evan Cheng's avatar
      Don't break strict aliasing. · 9e76c047
      Evan Cheng authored
      llvm-svn: 52026
      9e76c047
  6. Jun 03, 2008
  7. Jun 02, 2008
  8. May 31, 2008
    • Dan Gohman's avatar
      Teach the DAGISelEmitter to not compute the variable_ops operand · bd3390c7
      Dan Gohman authored
      index for the input pattern in terms of the output pattern. Instead
      keep track of how many fixed operands the input pattern actually
      has, and have the input matching code pass the output-emitting
      function that index value. This simplifies the code, disentangles
      variables_ops from the support for predication operations, and
      makes variable_ops more robust.
      
      llvm-svn: 51808
      bd3390c7
  9. May 30, 2008
  10. May 29, 2008
  11. May 28, 2008
  12. May 24, 2008
  13. May 23, 2008
  14. May 22, 2008
  15. May 20, 2008
  16. May 19, 2008
  17. May 16, 2008
  18. May 15, 2008
  19. May 14, 2008
    • Dale Johannesen's avatar
      Add CommonLinkage; currently tentative definitions · ce4396bc
      Dale Johannesen authored
      are represented as "weak", but there are subtle differences
      in some cases on Darwin, so we need both.  The intent
      is that "common" will behave identically to "weak" unless
      somebody changes their target to do something else.
      No functional change as yet.
      
      llvm-svn: 51118
      ce4396bc
Loading