Skip to content
  1. Jan 19, 2015
    • Chandler Carruth's avatar
      [PM] Remove the Pass argument from all of the critical edge splitting · 37df2cfb
      Chandler Carruth authored
      APIs and replace it and numerous booleans with an option struct.
      
      The critical edge splitting API has a really large surface of flags and
      so it seems worth burning a small option struct / builder. This struct
      can be constructed with the various preserved analyses and then flags
      can be flipped in a builder style.
      
      The various users are now responsible for directly passing along their
      analysis information. This should be enough for the critical edge
      splitting to work cleanly with the new pass manager as well.
      
      This API is still pretty crufty and could be cleaned up a lot, but I've
      focused on this change just threading an option struct rather than
      a pass through the API.
      
      llvm-svn: 226456
      37df2cfb
    • Chandler Carruth's avatar
      [PM] Relax asserts and always try to reconstruct loop simplify form when · ad34d913
      Chandler Carruth authored
      we can while splitting critical edges.
      
      The only code which called this and didn't require simplified loops to
      be preserved is polly, and the code behaves correctly there anyways.
      Without this change, it becomes really hard to share this code with the
      new pass manager where things like preserving loop simplify form don't
      make any sense.
      
      If anyone discovers this code behaving incorrectly, what it *should* be
      testing for is whether the loops it needs to be in simplified form are
      in fact in that form. It should always be trying to preserve that form
      when it exists.
      
      llvm-svn: 226443
      ad34d913
    • Erik Eckstein's avatar
      SLPVectorizer: limit the number of alias checks to reduce the runtime. · 76cb53a8
      Erik Eckstein authored
      In case of blocks with many memory-accessing instructions, alias checking can take lot of time
      (because calculating the memory dependencies has quadratic complexity).
      I chose a limit which resulted in no changes when running the benchmarks.
      
      llvm-svn: 226439
      76cb53a8
    • Chandler Carruth's avatar
      [PM] Lift the analyses into the interface for · 0eae1120
      Chandler Carruth authored
      SplitLandingPadPredecessors and remove the Pass argument from its
      interface.
      
      Another step to the utilities being usable with both old and new pass
      managers.
      
      llvm-svn: 226426
      0eae1120
  2. Jan 18, 2015
  3. Jan 17, 2015
    • Chandler Carruth's avatar
      [PM] Remove a dead field. · 24fd029a
      Chandler Carruth authored
      This was dead even before I refactored how we initialized it, but my
      refactoring made it trivially dead and it is now caught by a Clang
      warning. This fixes the warning and should clean up the -Werror bot
      failures (sorry!).
      
      llvm-svn: 226376
      24fd029a
    • Chandler Carruth's avatar
      [PM] Split the LoopInfo object apart from the legacy pass, creating · 4f8f307c
      Chandler Carruth authored
      a LoopInfoWrapperPass to wire the object up to the legacy pass manager.
      
      This switches all the clients of LoopInfo over and paves the way to port
      LoopInfo to the new pass manager. No functionality change is intended
      with this iteration.
      
      llvm-svn: 226373
      4f8f307c
  4. 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
  5. 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
  6. Jan 14, 2015
Loading