Skip to content
  1. Jan 16, 2015
    • Mehdi Amini's avatar
    • Sanjoy Das's avatar
      Add a new pass "inductive range check elimination" · a1837a34
      Sanjoy Das authored
      IRCE eliminates range checks of the form
      
        0 <= A * I + B < Length
      
      by splitting a loop's iteration space into three segments in a way
      that the check is completely redundant in the middle segment.  As an
      example, IRCE will convert
      
        len = < known positive >
        for (i = 0; i < n; i++) {
          if (0 <= i && i < len) {
            do_something();
          } else {
            throw_out_of_bounds();
          }
        }
      
      to
      
        len = < known positive >
        limit = smin(n, len)
        // no first segment
        for (i = 0; i < limit; i++) {
          if (0 <= i && i < len) { // this check is fully redundant
            do_something();
          } else {
            throw_out_of_bounds();
          }
        }
        for (i = limit; i < n; i++) {
          if (0 <= i && i < len) {
            do_something();
          } else {
            throw_out_of_bounds();
          }
        }
      
      
      IRCE can deal with multiple range checks in the same loop (it takes
      the intersection of the ranges that will make each of them redundant
      individually).
      
      Currently IRCE does not do any profitability analysis.  That is a
      TODO.
      
      Please note that the status of this pass is *experimental*, and it is
      not part of any default pass pipeline.  Having said that, I will love
      to get feedback and general input from people interested in trying
      this out.
      
      This pass was originally r226201.  It was reverted because it used C++
      features not supported by MSVC 2012.
      
      Differential Revision: http://reviews.llvm.org/D6693
      
      llvm-svn: 226238
      a1837a34
  2. Jan 15, 2015
    • Sanjoy Das's avatar
      Revert r226201 (Add a new pass "inductive range check elimination") · 7f62ac8e
      Sanjoy Das authored
      The change used C++11 features not supported by MSVC 2012.  I will fix
      the change to use things supported MSVC 2012 and recommit shortly.
      
      llvm-svn: 226216
      7f62ac8e
    • David Majnemer's avatar
      InductiveRangeCheckElimination: Remove extra ';' · f1f72c9e
      David Majnemer authored
      This silences a GCC warning.
      
      llvm-svn: 226215
      f1f72c9e
    • Sanjoy Das's avatar
      Add a new pass "inductive range check elimination" · 7059e295
      Sanjoy Das authored
      IRCE eliminates range checks of the form
      
        0 <= A * I + B < Length
      
      by splitting a loop's iteration space into three segments in a way
      that the check is completely redundant in the middle segment.  As an
      example, IRCE will convert
      
        len = < known positive >
        for (i = 0; i < n; i++) {
          if (0 <= i && i < len) {
            do_something();
          } else {
            throw_out_of_bounds();
          }
        }
      
      to
      
        len = < known positive >
        limit = smin(n, len)
        // no first segment
        for (i = 0; i < limit; i++) {
          if (0 <= i && i < len) { // this check is fully redundant
            do_something();
          } else {
            throw_out_of_bounds();
          }
        }
        for (i = limit; i < n; i++) {
          if (0 <= i && i < len) {
            do_something();
          } else {
            throw_out_of_bounds();
          }
        }
      
      
      IRCE can deal with multiple range checks in the same loop (it takes
      the intersection of the ranges that will make each of them redundant
      individually).
      
      Currently IRCE does not do any profitability analysis.  That is a
      TODO.
      
      Please note that the status of this pass is *experimental*, and it is
      not part of any default pass pipeline.  Having said that, I will love
      to get feedback and general input from people interested in trying
      this out.
      
      Differential Revision: http://reviews.llvm.org/D6693
      
      llvm-svn: 226201
      7059e295
    • Alexander Kornienko's avatar
      Replace size method call of containers to empty method where appropriate · 8c0809c7
      Alexander Kornienko authored
      This patch was generated by a clang tidy checker that is being open sourced.
      The documentation of that checker is the following:
      
      /// The emptiness of a container should be checked using the empty method
      /// instead of the size method. It is not guaranteed that size is a
      /// constant-time function, and it is generally more efficient and also shows
      /// clearer intent to use empty. Furthermore some containers may implement the
      /// empty method but not implement the size method. Using empty whenever
      /// possible makes it easier to switch to another container in the future.
      
      Patch by Gábor Horváth!
      
      llvm-svn: 226161
      8c0809c7
    • Chandler Carruth's avatar
      [PM] Separate the TargetLibraryInfo object from the immutable pass. · b98f63db
      Chandler Carruth authored
      The pass is really just a means of accessing a cached instance of the
      TargetLibraryInfo object, and this way we can re-use that object for the
      new pass manager as its result.
      
      Lots of delta, but nothing interesting happening here. This is the
      common pattern that is developing to allow analyses to live in both the
      old and new pass manager -- a wrapper pass in the old pass manager
      emulates the separation intrinsic to the new pass manager between the
      result and pass for analyses.
      
      llvm-svn: 226157
      b98f63db
    • David Majnemer's avatar
      SimplifyIndVar: Remove unused variable · f0982d0a
      David Majnemer authored
      OtherOperandIdx is not used anymore, remove it to silence warnings.
      
      llvm-svn: 226138
      f0982d0a
    • NAKAMURA Takumi's avatar
      24ebfcb6
    • Chandler Carruth's avatar
      [PM] Move TargetLibraryInfo into the Analysis library. · 62d4215b
      Chandler Carruth authored
      While the term "Target" is in the name, it doesn't really have to do
      with the LLVM Target library -- this isn't an abstraction which LLVM
      targets generally need to implement or extend. It has much more to do
      with modeling the various runtime libraries on different OSes and with
      different runtime environments. The "target" in this sense is the more
      general sense of a target of cross compilation.
      
      This is in preparation for porting this analysis to the new pass
      manager.
      
      No functionality changed, and updates inbound for Clang and Polly.
      
      llvm-svn: 226078
      62d4215b
    • Sanjoy Das's avatar
      Fix PR22222 · 8c252bde
      Sanjoy Das authored
      The bug was introduced in r225282. r225282 assumed that sub X, Y is
      the same as add X, -Y. This is not correct if we are going to upgrade
      the sub to sub nuw. This change fixes the issue by making the
      optimization ignore sub instructions.
      
      Differential Revision: http://reviews.llvm.org/D6979
      
      llvm-svn: 226075
      8c252bde
  3. Jan 14, 2015
  4. Jan 13, 2015
  5. Jan 12, 2015
    • Sanjay Patel's avatar
      80-cols; NFC · 06d5589a
      Sanjay Patel authored
      llvm-svn: 225700
      06d5589a
    • Duncan P. N. Exon Smith's avatar
      IR: Split GenericMDNode into MDTuple and UniquableMDNode · 118632db
      Duncan P. N. Exon Smith authored
      Split `GenericMDNode` into two classes (with more descriptive names).
      
        - `UniquableMDNode` will be a common subclass for `MDNode`s that are
          sometimes uniqued like constants, and sometimes 'distinct'.
      
          This class gets the (short-lived) RAUW support and related API.
      
        - `MDTuple` is the basic tuple that has always been returned by
          `MDNode::get()`.  This is as opposed to more specific nodes to be
          added soon, which have additional fields, custom assembly syntax,
          and extra semantics.
      
          This class gets the hash-related logic, since other sublcasses of
          `UniquableMDNode` may need to hash based on other fields.
      
      To keep this diff from getting too big, I've added casts to `MDTuple`
      that won't really scale as new subclasses of `UniquableMDNode` are
      added, but I'll clean those up incrementally.
      
      (No functionality change intended.)
      
      llvm-svn: 225682
      118632db
    • Sanjay Patel's avatar
      GVN: propagate equalities for floating point compares · 5f1d9eaa
      Sanjay Patel authored
      Allow optimizations based on FP comparison values in the same way
      as integers. 
      
      This resolves PR17713:
      http://llvm.org/bugs/show_bug.cgi?id=17713
      
      Differential Revision: http://reviews.llvm.org/D6911
      
      llvm-svn: 225660
      5f1d9eaa
Loading