OSDN Git Service

[ADT] Make filter_iterator support bidirectional iteration
authorVedant Kumar <vsk@apple.com>
Wed, 25 Apr 2018 21:50:09 +0000 (21:50 +0000)
committerVedant Kumar <vsk@apple.com>
Wed, 25 Apr 2018 21:50:09 +0000 (21:50 +0000)
commitbf540e5abf5e440380e2a5e0ffc5d0facf4fb63f
tree21a3300f274a068ea467a51f343c6be12b8f2d78
parentc2341723b51e8dda07636220c0c81e2a9af3fdd8
[ADT] Make filter_iterator support bidirectional iteration

This makes it possible to reverse a filtered range. For example, here's
a way to visit memory accesses in a BasicBlock in reverse order:

    auto MemInsts = reverse(make_filter_range(BB, [](Instruction &I) {
      return isa<StoreInst>(&I) || isa<LoadInst>(&I);
    }));

    for (auto &MI : MemInsts)
      ...

To implement this functionality, I factored out forward iteration
functionality into filter_iterator_base, and added a specialization of
filter_iterator_impl which supports bidirectional iteration. Thanks to
Tim Shen, Zachary Turner, and others for suggesting this design and
providing feedback! This version of the patch supersedes the original
(https://reviews.llvm.org/D45792).

This was motivated by a problem we encountered in D45657: we'd like to
visit the non-debug-info instructions in a BasicBlock in reverse order.

Testing: check-llvm, check-clang

Differential Revision: https://reviews.llvm.org/D45853

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330875 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/ADT/STLExtras.h
unittests/ADT/IteratorTest.cpp
unittests/IR/BasicBlockTest.cpp