Skip to content
  1. Oct 16, 2014
  2. Sep 13, 2014
  3. Sep 07, 2014
    • Hal Finkel's avatar
      Make use of @llvm.assume in ValueTracking (computeKnownBits, etc.) · 60db0589
      Hal Finkel authored
      This change, which allows @llvm.assume to be used from within computeKnownBits
      (and other associated functions in ValueTracking), adds some (optional)
      parameters to computeKnownBits and friends. These functions now (optionally)
      take a "context" instruction pointer, an AssumptionTracker pointer, and also a
      DomTree pointer, and most of the changes are just to pass this new information
      when it is easily available from InstSimplify, InstCombine, etc.
      
      As explained below, the significant conceptual change is that known properties
      of a value might depend on the control-flow location of the use (because we
      care that the @llvm.assume dominates the use because assumptions have
      control-flow dependencies). This means that, when we ask if bits are known in a
      value, we might get different answers for different uses.
      
      The significant changes are all in ValueTracking. Two main changes: First, as
      with the rest of the code, new parameters need to be passed around. To make
      this easier, I grouped them into a structure, and I made internal static
      versions of the relevant functions that take this structure as a parameter. The
      new code does as you might expect, it looks for @llvm.assume calls that make
      use of the value we're trying to learn something about (often indirectly),
      attempts to pattern match that expression, and uses the result if successful.
      By making use of the AssumptionTracker, the process of finding @llvm.assume
      calls is not expensive.
      
      Part of the structure being passed around inside ValueTracking is a set of
      already-considered @llvm.assume calls. This is to prevent a query using, for
      example, the assume(a == b), to recurse on itself. The context and DT params
      are used to find applicable assumptions. An assumption needs to dominate the
      context instruction, or come after it deterministically. In this latter case we
      only handle the specific case where both the assumption and the context
      instruction are in the same block, and we need to exclude assumptions from
      being used to simplify their own ephemeral values (those which contribute only
      to the assumption) because otherwise the assumption would prove its feeding
      comparison trivial and would be removed.
      
      This commit adds the plumbing and the logic for a simple masked-bit propagation
      (just enough to write a regression test). Future commits add more patterns
      (and, correspondingly, more regression tests).
      
      llvm-svn: 217342
      60db0589
    • Hal Finkel's avatar
      Add an Assumption-Tracking Pass · 74c2f355
      Hal Finkel authored
      This adds an immutable pass, AssumptionTracker, which keeps a cache of
      @llvm.assume call instructions within a module. It uses callback value handles
      to keep stale functions and intrinsics out of the map, and it relies on any
      code that creates new @llvm.assume calls to notify it of the new instructions.
      The benefit is that code needing to find @llvm.assume intrinsics can do so
      directly, without scanning the function, thus allowing the cost of @llvm.assume
      handling to be negligible when none are present.
      
      The current design is intended to be lightweight. We don't keep track of
      anything until we need a list of assumptions in some function. The first time
      this happens, we scan the function. After that, we add/remove @llvm.assume
      calls from the cache in response to registration calls and ValueHandle
      callbacks.
      
      There are no new direct test cases for this pass, but because it calls it
      validation function upon module finalization, we'll pick up detectable
      inconsistencies from the other tests that touch @llvm.assume calls.
      
      This pass will be used by follow-up commits that make use of @llvm.assume.
      
      llvm-svn: 217334
      74c2f355
  4. Sep 04, 2014
  5. Sep 01, 2014
    • Hal Finkel's avatar
      Feed AA to the inliner and use AA->getModRefBehavior in AddAliasScopeMetadata · 0c083024
      Hal Finkel authored
      This feeds AA through the IFI structure into the inliner so that
      AddAliasScopeMetadata can use AA->getModRefBehavior to figure out which
      functions only access their arguments (instead of just hard-coding some
      knowledge of memory intrinsics). Most of the information is only available from
      BasicAA; this is important for preserving alias scoping information for
      target-specific intrinsics when doing the noalias parameter attribute to
      metadata conversion.
      
      llvm-svn: 216866
      0c083024
    • Hal Finkel's avatar
      Fix AddAliasScopeMetadata again - alias.scope must be a complete description · cbb85f24
      Hal Finkel authored
      I thought that I had fixed this problem in r216818, but I did not do a very
      good job. The underlying issue is that when we add alias.scope metadata we are
      asserting that this metadata completely describes the aliasing relationships
      within the current aliasing scope domain, and so in the context of translating
      noalias argument attributes, the pointers must all be based on noalias
      arguments (as underlying objects) and have no other kind of underlying object.
      In r216818 excluding appropriate accesses from getting alias.scope metadata is
      done by looking for underlying objects that are not identified function-local
      objects -- but that's wrong because allocas, etc. are also function-local
      objects and we need to explicitly check that all underlying objects are the
      noalias arguments for which we're adding metadata aliasing scopes.
      
      This fixes the underlying-object check for adding alias.scope metadata, and
      does some refactoring of the related capture-checking eligibility logic (and
      adds more comments; hopefully making everything a bit clearer).
      
      Fixes self-hosting on x86_64 with -mllvm -enable-noalias-to-md-conversion (the
      feature is still disabled by default).
      
      llvm-svn: 216863
      cbb85f24
  6. Aug 30, 2014
    • Hal Finkel's avatar
      Fix AddAliasScopeMetadata to not add scopes when deriving from unknown pointers · a3708df4
      Hal Finkel authored
      The previous implementation of AddAliasScopeMetadata, which adds noalias
      metadata to preserve noalias parameter attribute information when inlining had
      a flaw: it would add alias.scope metadata to accesses which might have been
      derived from pointers other than noalias function parameters. This was
      incorrect because even some access known not to alias with all noalias function
      parameters could easily alias with an access derived from some other pointer.
      Instead, when deriving from some unknown pointer, we cannot add alias.scope
      metadata at all. This fixes a miscompile of the test-suite's tramp3d-v4.
      Furthermore, we cannot add alias.scope to functions unless we know they
      access only argument-derived pointers (currently, we know this only for
      memory intrinsics).
      
      Also, we fix a theoretical problem with using the NoCapture attribute to skip
      the capture check. This is incorrect (as explained in the comment added), but
      would not matter in any code generated by Clang because we get only inferred
      nocapture attributes in Clang-generated IR.
      
      This functionality is not yet enabled by default.
      
      llvm-svn: 216818
      a3708df4
  7. Aug 29, 2014
  8. Aug 27, 2014
  9. Aug 25, 2014
  10. Aug 21, 2014
  11. Aug 18, 2014
  12. Aug 14, 2014
    • Hal Finkel's avatar
      Copy noalias metadata from call sites to inlined instructions · 61c38612
      Hal Finkel authored
      When a call site with noalias metadata is inlined, that metadata can be
      propagated directly to the inlined instructions (only those that might access
      memory because it is not useful on the others). Prior to inlining, the noalias
      metadata could express that a call would not alias with some other memory
      access, which implies that no instruction within that called function would
      alias. By propagating the metadata to the inlined instructions, we preserve
      that knowledge.
      
      This should complete the enhancements requested in PR20500.
      
      llvm-svn: 215676
      61c38612
    • Hal Finkel's avatar
      Add noalias metadata for general calls (not just memory intrinsics) during inlining · d2dee16c
      Hal Finkel authored
      When preserving noalias function parameter attributes by adding noalias
      metadata in the inliner, we should do this for general function calls (not just
      memory intrinsics). The logic is very similar to what already existed (except
      that we want to add this metadata even for functions taking no relevant
      parameters). This metadata can be used by ModRef queries in the caller after
      inlining.
      
      This addresses the first part of PR20500. Adding noalias metadata during
      inlining is still turned off by default.
      
      llvm-svn: 215657
      d2dee16c
  13. Aug 12, 2014
  14. Jul 25, 2014
    • Hal Finkel's avatar
      Convert noalias parameter attributes into noalias metadata during inlining · ff0bcb60
      Hal Finkel authored
      This functionality is currently turned off by default.
      
      Part of the motivation for introducing scoped-noalias metadata is to enable the
      preservation of noalias parameter attribute information after inlining.
      Sometimes this can be inferred from the code in the caller after inlining, but
      often we simply lose valuable information.
      
      The overall process if fairly simple:
       1. Create a new unqiue scope domain.
       2. For each (used) noalias parameter, create a new alias scope.
       3. For each pointer, collect the underlying objects. Add a noalias scope for
          each noalias parameter from which we're not derived (and has not been
          captured prior to that point).
       4. Add an alias.scope for each noalias parameter from which we might be
          derived (or has been captured before that point).
      
      Note that the capture checks apply only if one of the underlying objects is not
      an identified function-local object.
      
      llvm-svn: 213949
      ff0bcb60
  15. Jul 24, 2014
    • Hal Finkel's avatar
      Add scoped-noalias metadata · 9414665a
      Hal Finkel authored
      This commit adds scoped noalias metadata. The primary motivations for this
      feature are:
        1. To preserve noalias function attribute information when inlining
        2. To provide the ability to model block-scope C99 restrict pointers
      
      Neither of these two abilities are added here, only the necessary
      infrastructure. In fact, there should be no change to existing functionality,
      only the addition of new features. The logic that converts noalias function
      parameters into this metadata during inlining will come in a follow-up commit.
      
      What is added here is the ability to generally specify noalias memory-access
      sets. Regarding the metadata, alias-analysis scopes are defined similar to TBAA
      nodes:
      
      !scope0 = metadata !{ metadata !"scope of foo()" }
      !scope1 = metadata !{ metadata !"scope 1", metadata !scope0 }
      !scope2 = metadata !{ metadata !"scope 2", metadata !scope0 }
      !scope3 = metadata !{ metadata !"scope 2.1", metadata !scope2 }
      !scope4 = metadata !{ metadata !"scope 2.2", metadata !scope2 }
      
      Loads and stores can be tagged with an alias-analysis scope, and also, with a
      noalias tag for a specific scope:
      
      ... = load %ptr1, !alias.scope !{ !scope1 }
      ... = load %ptr2, !alias.scope !{ !scope1, !scope2 }, !noalias !{ !scope1 }
      
      When evaluating an aliasing query, if one of the instructions is associated
      with an alias.scope id that is identical to the noalias scope associated with
      the other instruction, or is a descendant (in the scope hierarchy) of the
      noalias scope associated with the other instruction, then the two memory
      accesses are assumed not to alias.
      
      Note that is the first element of the scope metadata is a string, then it can
      be combined accross functions and translation units. The string can be replaced
      by a self-reference to create globally unqiue scope identifiers.
      
      [Note: This overview is slightly stylized, since the metadata nodes really need
      to just be numbers (!0 instead of !scope0), and the scope lists are also global
      unnamed metadata.]
      
      Existing noalias metadata in a callee is "cloned" for use by the inlined code.
      This is necessary because the aliasing scopes are unique to each call site
      (because of possible control dependencies on the aliasing properties). For
      example, consider a function: foo(noalias a, noalias b) { *a = *b; } that gets
      inlined into bar() { ... if (...) foo(a1, b1); ... if (...) foo(a2, b2); } --
      now just because we know that a1 does not alias with b1 at the first call site,
      and a2 does not alias with b2 at the second call site, we cannot let inlining
      these functons have the metadata imply that a1 does not alias with b2.
      
      llvm-svn: 213864
      9414665a
  16. Jun 30, 2014
    • David Blaikie's avatar
      DebugInfo: Preserve debug location information when transforming a call into... · 644d2eee
      David Blaikie authored
      DebugInfo: Preserve debug location information when transforming a call into an invoke during inlining.
      
      This both improves basic debug info quality, but also fixes a larger
      hole whenever we inline a call/invoke without a location (debug info for
      the entire inlining is lost and other badness that the debug info
      emission code is currently working around but shouldn't have to).
      
      llvm-svn: 212065
      644d2eee
  17. Jun 09, 2014
    • Evgeniy Stepanov's avatar
      Fix line numbers for code inlined from __nodebug__ functions. · 2be29929
      Evgeniy Stepanov authored
      Instructions from __nodebug__ functions don't have file:line
      information even when inlined into no-nodebug functions. As a result,
      intrinsics (SSE and other) from <*intrin.h> clang headers _never_
      have file:line information.
      
      With this change, an instruction without !dbg metadata gets one from
      the call instruction when inlined.
      
      Fixes PR19001.
      
      llvm-svn: 210459
      2be29929
  18. May 15, 2014
  19. Apr 25, 2014
  20. Apr 23, 2014
  21. Apr 21, 2014
    • Reid Kleckner's avatar
      Fix PR7272 in -tailcallelim instead of the inliner · 9b2cc647
      Reid Kleckner authored
      The -tailcallelim pass should be checking if byval or inalloca args can
      be captured before marking calls as tail calls.  This was the real root
      cause of PR7272.
      
      With a better fix in place, revert the inliner change from r105255.  The
      test case it introduced still passes and has been moved to
      test/Transforms/Inline/byval-tail-call.ll.
      
      Reviewers: chandlerc
      
      Differential Revision: http://reviews.llvm.org/D3403
      
      llvm-svn: 206789
      9b2cc647
  22. Apr 15, 2014
  23. Mar 09, 2014
    • Chandler Carruth's avatar
      [C++11] Add range based accessors for the Use-Def chain of a Value. · cdf47884
      Chandler Carruth authored
      This requires a number of steps.
      1) Move value_use_iterator into the Value class as an implementation
         detail
      2) Change it to actually be a *Use* iterator rather than a *User*
         iterator.
      3) Add an adaptor which is a User iterator that always looks through the
         Use to the User.
      4) Wrap these in Value::use_iterator and Value::user_iterator typedefs.
      5) Add the range adaptors as Value::uses() and Value::users().
      6) Update *all* of the callers to correctly distinguish between whether
         they wanted a use_iterator (and to explicitly dig out the User when
         needed), or a user_iterator which makes the Use itself totally
         opaque.
      
      Because #6 requires churning essentially everything that walked the
      Use-Def chains, I went ahead and added all of the range adaptors and
      switched them to range-based loops where appropriate. Also because the
      renaming requires at least churning every line of code, it didn't make
      any sense to split these up into multiple commits -- all of which would
      touch all of the same lies of code.
      
      The result is still not quite optimal. The Value::use_iterator is a nice
      regular iterator, but Value::user_iterator is an iterator over User*s
      rather than over the User objects themselves. As a consequence, it fits
      a bit awkwardly into the range-based world and it has the weird
      extra-dereferencing 'operator->' that so many of our iterators have.
      I think this could be fixed by providing something which transforms
      a range of T&s into a range of T*s, but that *can* be separated into
      another patch, and it isn't yet 100% clear whether this is the right
      move.
      
      However, this change gets us most of the benefit and cleans up
      a substantial amount of code around Use and User. =]
      
      llvm-svn: 203364
      cdf47884
  24. Mar 06, 2014
  25. Mar 04, 2014
  26. Feb 18, 2014
  27. Dec 08, 2013
    • Mark Seaborn's avatar
      Fix inlining to not lose the "cleanup" clause from landingpads · 1b3dd352
      Mark Seaborn authored
      This fixes PR17872.  This bug can lead to C++ destructors not being
      called when they should be, when an exception is thrown.
      
      llvm-svn: 196711
      1b3dd352
    • Mark Seaborn's avatar
      Fix inlining to not produce duplicate landingpad clauses · ef3dbb93
      Mark Seaborn authored
      Before this change, inlining one "invoke" into an outer "invoke" call
      site can lead to the outer landingpad's catch/filter clauses being
      copied multiple times into the resulting landingpad.  This happens:
      
       * when the inlined function contains multiple "resume" instructions,
         because forwardResume() copies the clauses but is called multiple
         times;
      
       * when the inlined function contains a "resume" and a "call", because
         HandleCallsInBlockInlinedThroughInvoke() copies the clauses but is
         redundant with forwardResume().
      
      Fix this by deduplicating the code.
      
      This problem doesn't lead to any incorrect execution; it's only
      untidy.
      
      This change will make fixing PR17872 a little easier.
      
      llvm-svn: 196710
      ef3dbb93
  28. Dec 02, 2013
  29. Nov 03, 2013
  30. Oct 31, 2013
    • Manman Ren's avatar
      Do not convert "call asm" to "invoke asm" in Inliner. · 87a2adc7
      Manman Ren authored
      Given that backend does not handle "invoke asm" correctly ("invoke asm" will be
      handled by SelectionDAGBuilder::visitInlineAsm, which does not have the right
      setup for LPadToCallSiteMap) and we already made the assumption that inline asm
      does not throw in InstCombiner::visitCallSite, we are going to make the same
      assumption in Inliner to make sure we don't convert "call asm" to "invoke asm".
      
      If it becomes necessary to add support for "invoke asm" later on, we will need
      to modify the backend as well as remove the assumptions that inline asm does
      not throw.
      
      Fix rdar://15317907
      
      llvm-svn: 193808
      87a2adc7
Loading