Skip to content
  1. Oct 15, 2012
    • Chandler Carruth's avatar
      Update the memcpy rewriting to fully support widened int rewriting. This · 49c8eea3
      Chandler Carruth authored
      includes extracting ints for copying elsewhere and inserting ints when
      copying into the alloca. This should fix the CanSROA assertion coming
      out of Clang's regression test suite.
      
      llvm-svn: 165931
      49c8eea3
    • Chandler Carruth's avatar
      Follow-up fix to r165928: handle memset rewriting for widened integers, · 9d966a20
      Chandler Carruth authored
      and generally clean up the memset handling. It had rotted a bit as the
      other rewriting logic got polished more.
      
      llvm-svn: 165930
      9d966a20
    • Chandler Carruth's avatar
      First major step toward addressing PR14059. This teaches SROA to handle · 435c4e07
      Chandler Carruth authored
      cases where we have partial integer loads and stores to an otherwise
      promotable alloca to widen[1] those loads and stores to cover the entire
      alloca and bitcast them into the appropriate type such that promotion
      can proceed.
      
      These partial loads and stores stem from an annoying confluence of ARM's
      calling convention and ABI lowering and the FCA pre-splitting which
      takes place in SROA. Clang lowers a { double, double } in-register
      function argument as a [4 x i32] function argument to ensure it is
      placed into integer 32-bit registers (a really unnerving implicit
      contract between Clang and the ARM backend I would add). This results in
      a FCA load of [4 x i32]* from the { double, double } alloca, and SROA
      decomposes this into a sequence of i32 loads and stores. Inlining
      proceeds, code gets folded, but at the end of the day, we still have i32
      stores to the low and high halves of a double alloca. Widening these to
      be i64 operations, and bitcasting them to double prior to loading or
      storing allows promotion to proceed for these allocas.
      
      I looked quite a bit changing the IR which Clang produces for this case
      to be more friendly, but small changes seem unlikely to help. I think
      the best representation we could use currently would be to pass 4 i32
      arguments thereby avoiding any FCAs, but that would still require this
      fix. It seems like it might eventually be nice to somehow encode the ABI
      register selection choices outside of the parameter type system so that
      the parameter can be a { double, double }, but the CC register
      annotations indicate that this should be passed via 4 integer registers.
      
      This patch does not address the second problem in PR14059, which is the
      reverse: when a struct alloca is loaded as a *larger* single integer.
      
      This patch also does not address some of the code quality issues with
      the FCA-splitting. Those don't actually impede any optimizations really,
      but they're on my list to clean up.
      
      [1]: Pedantic footnote: for those concerned about memory model issues
      here, this is safe. For the alloca to be promotable, it cannot escape or
      have any use of its address that could allow these loads or stores to be
      racing. Thus, widening is always safe.
      
      llvm-svn: 165928
      435c4e07
    • Chandler Carruth's avatar
      Hoist the canConvertValue predicate and the convertValue transform out · aa6afbb8
      Chandler Carruth authored
      into static helper functions. They're really quite generic and are going
      to be needed elsewhere shortly.
      
      llvm-svn: 165927
      aa6afbb8
    • Bill Wendling's avatar
      Add an enum for the return and function indexes into the AttrListPtr object.... · fbd38fe2
      Bill Wendling authored
      Add an enum for the return and function indexes into the AttrListPtr object. This gets rid of some magic numbers.
      
      llvm-svn: 165924
      fbd38fe2
    • Bill Wendling's avatar
      Attributes Rewrite · d079a446
      Bill Wendling authored
      Convert the internal representation of the Attributes class into a pointer to an
      opaque object that's uniqued by and stored in the LLVMContext object. The
      Attributes class then becomes a thin wrapper around this opaque
      object. Eventually, the internal representation will be expanded to include
      attributes that represent code generation options, etc.
      
      llvm-svn: 165917
      d079a446
    • Meador Inge's avatar
      instcombine: Migrate strcmp and strncmp optimizations · 40b6fac3
      Meador Inge authored
      This patch migrates the strcmp and strncmp optimizations from the
      simplify-libcalls pass into the instcombine library call simplifier.
      
      llvm-svn: 165915
      40b6fac3
  2. Oct 14, 2012
  3. Oct 13, 2012
    • Meador Inge's avatar
      instcombine: Migrate strchr and strrchr optimizations · 17418508
      Meador Inge authored
      This patch migrates the strchr and strrchr optimizations from the
      simplify-libcalls pass into the instcombine library call simplifier.
      
      llvm-svn: 165875
      17418508
    • Meador Inge's avatar
      instcombine: Migrate strcat and strncat optimizations · 7fb2f737
      Meador Inge authored
      This patch migrates the strcat and strncat optimizations from the
      simplify-libcalls pass into the instcombine library call simplifier.
      
      llvm-svn: 165874
      7fb2f737
    • Chandler Carruth's avatar
      Teach SROA to cope with wrapper aggregates. These show up a lot in ABI · ba931992
      Chandler Carruth authored
      type coercion code, especially when targetting ARM. Things like [1
      x i32] instead of i32 are very common there.
      
      The goal of this logic is to ensure that when we are picking an alloca
      type, we look through such wrapper aggregates and across any zero-length
      aggregate elements to find the simplest type possible to form a type
      partition.
      
      This logic should (generally speaking) rarely fire. It only ends up
      kicking in when an alloca is accessed using two different types (for
      instance, i32 and float), and the underlying alloca type has wrapper
      aggregates around it. I noticed a significant amount of this occurring
      looking at stepanov_abstraction generated code for arm, and suspect it
      happens elsewhere as well.
      
      Note that this doesn't yet address truly heinous IR productions such as
      PR14059 is concerning. Those result in mismatched *sizes* of types in
      addition to mismatched access and alloca types.
      
      llvm-svn: 165870
      ba931992
    • Chandler Carruth's avatar
      Speculatively harden the conversion logic. I have no idea if this will · 482c6178
      Chandler Carruth authored
      help the dragonegg builders, and no test case at this point, but this
      was one dimly plausible case I spotted by inspection. Hopefully will get
      a testcase from those bots soon-ish, and will tidy this up with proper
      testing.
      
      llvm-svn: 165869
      482c6178
    • Chandler Carruth's avatar
      Silence a warning in -assert builds. · 0fb8a778
      Chandler Carruth authored
      llvm-svn: 165867
      0fb8a778
    • Chandler Carruth's avatar
      Clean up how we rewrite loads and stores to the whole alloca. When these · 891fec0b
      Chandler Carruth authored
      are single value types, the load and store should be directly based upon
      the alloca and then bitcasting can fix the type as needed afterward.
      This might in theory improve some of the IR coming out of SROA, but
      I don't expect big changes yet and don't have any test cases on hand.
      This is really just a cleanup/refactoring patch. The next patch will
      cause this code path to be hit a lot more, actually get SROA to promote
      more allocas and include several more test cases.
      
      llvm-svn: 165864
      891fec0b
  4. Oct 11, 2012
  5. Oct 10, 2012
  6. Oct 09, 2012
  7. Oct 08, 2012
  8. Oct 05, 2012
  9. Oct 04, 2012
    • Preston Gurd's avatar
      This patch corrects commit 165126 by using an integer bit width instead of · 0d67f510
      Preston Gurd authored
      a pointer to a type, in order to remove the uses of getGlobalContext().
      
      Patch by Tyler Nowicki.
      
      llvm-svn: 165255
      0d67f510
    • Jakub Staszak's avatar
      Add a comment to the commit r165187. · e076cac0
      Jakub Staszak authored
      llvm-svn: 165238
      e076cac0
    • Duncan Sands's avatar
      In my recent change to avoid use of underaligned memory I didn't notice that · a6d20010
      Duncan Sands authored
      cpyDest can be mutated in some cases, which would then cause a crash later if
      indeed the memory was underaligned.  This brought down several buildbots, so
      I guess the underaligned case is much more common than I thought!
      
      llvm-svn: 165228
      a6d20010
    • Chandler Carruth's avatar
      Fix PR13969, a mini-phase-ordering issue with the new SROA pass. · ac8317fd
      Chandler Carruth authored
      Currently, we re-visit allocas when something changes about the way they
      might be *split* to allow better scalarization to take place. However,
      we weren't handling the case when the *promotion* is what would change
      the behavior of SROA. When an address derived from an alloca is stored
      into another alloca, we consider the first to have escaped. If the
      second is ever promoted to an SSA value, we will suddenly be able to run
      the SROA pass on the first alloca.
      
      This patch adds explicit support for this form if iteration. When we
      detect a store of a pointer derived from an alloca, we flag the
      underlying alloca for reprocessing after promotion. The logic works hard
      to only do this when there is definitely going to be promotion and it
      might remove impediments to the analysis of the alloca.
      
      Thanks to Nick for the great test case and Benjamin for some sanity
      check review.
      
      llvm-svn: 165223
      ac8317fd
    • Duncan Sands's avatar
      The memcpy optimizer was happily doing call slot forwarding when the new memory · c6ada69a
      Duncan Sands authored
      was less aligned than the old.  In the testcase this results in an overaligned
      memset: the memset alignment was correct for the original memory but is too much
      for the new memory.  Fix this by either increasing the alignment of the new
      memory or bailing out if that isn't possible.  Should fix the gcc-4.7 self-host
      buildbot failure.
      
      llvm-svn: 165220
      c6ada69a
    • Chandler Carruth's avatar
      Teach the integer-promotion rewrite strategy to be endianness aware. · 43c8b46d
      Chandler Carruth authored
      Sorry for this being broken so long. =/
      
      As part of this, switch all of the existing tests to be Little Endian,
      which is the behavior I was asserting in them anyways! Add in a new
      big-endian test that checks the interesting behavior there.
      
      Another part of this is to tighten the rules abotu when we perform the
      full-integer promotion. This logic now rejects cases where there fully
      promoted integer is a non-multiple-of-8 bitwidth or cases where the
      loads or stores touch bits which are in the allocated space of the
      alloca but are not loaded or stored when accessing the integer. Sadly,
      these aren't really observable today as the rest of the pass will
      already ensure the invariants hold. However, the latter situation is
      likely to become a potential concern in the future.
      
      Thanks to Benjamin and Duncan for early review of this patch. I'm still
      looking into whether there are further endianness issues, please let me
      know if anyone sees BE failures persisting past this.
      
      llvm-svn: 165219
      43c8b46d
    • Bill Wendling's avatar
      Use method to query for attributes. · e8619aa1
      Bill Wendling authored
      llvm-svn: 165209
      e8619aa1
    • Jakub Staszak's avatar
      Fix PR13967. · f8a81295
      Jakub Staszak authored
      llvm-svn: 165187
      f8a81295
Loading