1. Apr 19, 2013
    • Jordan Rose's avatar
      [analyzer] "Force" LazyCompoundVals on bind when they are simple enough. · 3720e2f0
      Jordan Rose authored
      The analyzer uses LazyCompoundVals to represent rvalues of aggregate types,
      most importantly structs and arrays. This allows us to efficiently copy
      around an entire struct, rather than doing a memberwise load every time a
      struct rvalue is encountered. This can also keep memory usage down by
      allowing several structs to "share" the same snapshotted bindings.
      
      However, /lookup/ through LazyCompoundVals can be expensive, especially
      since they can end up chaining back to the original value. While we try
      to reuse LazyCompoundVals whenever it's safe, and cache information about
      this transitivity, the fact is it's sometimes just not a good idea to
      perpetuate LazyCompoundVals -- the tradeoffs just aren't worth it.
      
      This commit changes RegionStore so that binding a LazyCompoundVal to struct
      will do a memberwise copy if the struct is simple enough. Today's definition
      of "simple enough" is "up to N scalar members" (see below), but that could
      easily be changed in the future. This is enough to bring the test case in
      PR15697 back down to a manageable analysis time (within 20% of its original
      time, in an unfair test where the new analyzer is not compiled with LTO).
      
      The actual value of "N" is controlled by a new -analyzer-config option,
      'region-store-small-struct-limit'. It defaults to "2", meaning structs with
      zero, one, or two scalar members will be considered "simple enough" for
      this code path.
      
      It's worth noting that a more straightforward implementation would do this
      on load, not on bind, and make use of the structure we already have for this:
      CompoundVal. A long time ago, this was actually how RegionStore modeled
      aggregate-to-aggregate copies, but today it's only used for compound literals.
      Unfortunately, it seems that we've special-cased LazyCompoundVal in certain
      places (such as liveness checks) but failed to similarly special-case
      CompoundVal in all of them. Until we're confident that CompoundVal is
      handled properly everywhere, this solution is safer, since the entire
      optimization is just an implementation detail of RegionStore.
      
      <rdar://problem/13599304>
      
      llvm-svn: 179767
      3720e2f0
    • Jordan Rose's avatar
      [analyzer] Don't crash if we cache out after making a temporary region. · cdb44bdb
      Jordan Rose authored
      A C++ overloaded operator may be implemented as an instance method, and
      that instance method may be called on an rvalue object, which has no
      associated region. The analyzer handles this by creating a temporary region
      just for the evaluation of this call; however, it is possible that /by
      creating the region/, the analyzer ends up in a previously-explored state.
      In this case we don't need to continue along this path.
      
      This doesn't actually show any behavioral change now, but it starts being
      used with the next commit and prevents an assertion failure there.
      
      llvm-svn: 179766
      cdb44bdb
    • Chad Rosier's avatar
      db003998
    • Chad Rosier's avatar
      Make this private method. · c2f055d1
      Chad Rosier authored
      llvm-svn: 179764
      c2f055d1
    • Eli Bendersky's avatar
      Fixes to LangRef.rst: incorrect attributes syntax and misplaced 'nobuiltin' · 97ad9245
      Eli Bendersky authored
      Patch by Stephen Lin
      
      llvm-svn: 179763
      97ad9245
  2. Apr 18, 2013