[llvm] r330316 - [BasicBlock] Add instructionsWithoutDebug methods to skip debug insts.
Vedant Kumar via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 8 15:36:16 PDT 2018
Sorry, but I've got a super-late nitpick about this :).
I've noticed that the convention in MachineRegisterInfo is to use "foo_nodbg" for iterators that skip debug info, e.g use_nodbg_iterator, reg_nodbg_bundles, reg_nodbg_operands etc. Another convention is to use lowercase '_'-separated words in names. What do you think of following suit here, say, with 'instructions_nodbg'?
vedant
> On Apr 19, 2018, at 2:48 AM, Florian Hahn via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: fhahn
> Date: Thu Apr 19 02:48:07 2018
> New Revision: 330316
>
> URL: http://llvm.org/viewvc/llvm-project?rev=330316&view=rev
> Log:
> [BasicBlock] Add instructionsWithoutDebug methods to skip debug insts.
>
> Reviewers: aprantl, vsk, mattd, chandlerc
>
> Reviewed By: aprantl, vsk
>
> Differential Revision: https://reviews.llvm.org/D45657
>
> Modified:
> llvm/trunk/include/llvm/IR/BasicBlock.h
> llvm/trunk/lib/IR/BasicBlock.cpp
> llvm/trunk/unittests/IR/BasicBlockTest.cpp
>
> Modified: llvm/trunk/include/llvm/IR/BasicBlock.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/BasicBlock.h?rev=330316&r1=330315&r2=330316&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/BasicBlock.h (original)
> +++ llvm/trunk/include/llvm/IR/BasicBlock.h Thu Apr 19 02:48:07 2018
> @@ -182,6 +182,18 @@ public:
> ->getFirstInsertionPt().getNonConst();
> }
>
> + /// Return a const iterator range over the instructions in the block, skipping
> + /// any debug instructions.
> + iterator_range<filter_iterator<BasicBlock::const_iterator,
> + std::function<bool(const Instruction &)>>>
> + instructionsWithoutDebug() const;
> +
> + /// Return an iterator range over the instructions in the block, skipping any
> + /// debug instructions.
> + iterator_range<filter_iterator<BasicBlock::iterator,
> + std::function<bool(Instruction &)>>>
> + instructionsWithoutDebug();
> +
> /// Unlink 'this' from the containing function, but do not delete it.
> void removeFromParent();
>
>
> Modified: llvm/trunk/lib/IR/BasicBlock.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/BasicBlock.cpp?rev=330316&r1=330315&r2=330316&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/BasicBlock.cpp (original)
> +++ llvm/trunk/lib/IR/BasicBlock.cpp Thu Apr 19 02:48:07 2018
> @@ -90,6 +90,24 @@ void BasicBlock::setParent(Function *par
> InstList.setSymTabObject(&Parent, parent);
> }
>
> +iterator_range<filter_iterator<BasicBlock::const_iterator,
> + std::function<bool(const Instruction &)>>>
> +BasicBlock::instructionsWithoutDebug() const {
> + std::function<bool(const Instruction &)> Fn = [](const Instruction &I) {
> + return !isa<DbgInfoIntrinsic>(I);
> + };
> + return make_filter_range(*this, Fn);
> +}
> +
> +iterator_range<filter_iterator<BasicBlock::iterator,
> + std::function<bool(Instruction &)>>>
> +BasicBlock::instructionsWithoutDebug() {
> + std::function<bool(Instruction &)> Fn = [](Instruction &I) {
> + return !isa<DbgInfoIntrinsic>(I);
> + };
> + return make_filter_range(*this, Fn);
> +}
> +
> void BasicBlock::removeFromParent() {
> getParent()->getBasicBlockList().remove(getIterator());
> }
>
> Modified: llvm/trunk/unittests/IR/BasicBlockTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/BasicBlockTest.cpp?rev=330316&r1=330315&r2=330316&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/IR/BasicBlockTest.cpp (original)
> +++ llvm/trunk/unittests/IR/BasicBlockTest.cpp Thu Apr 19 02:48:07 2018
> @@ -77,5 +77,44 @@ TEST(BasicBlockTest, PhiRange) {
> }
> }
>
> +#define CHECK_ITERATORS(Range1, Range2) \
> + EXPECT_EQ(std::distance(Range1.begin(), Range1.end()), \
> + std::distance(Range2.begin(), Range2.end())); \
> + for (auto Pair : zip(Range1, Range2)) \
> + EXPECT_EQ(&std::get<0>(Pair), std::get<1>(Pair));
> +
> +TEST(BasicBlockTest, TestSkipInsts) {
> + LLVMContext Ctx;
> +
> + std::unique_ptr<Module> M(new Module("MyModule", Ctx));
> + Type *ArgTy1[] = {Type::getInt32PtrTy(Ctx)};
> + FunctionType *FT = FunctionType::get(Type::getVoidTy(Ctx), ArgTy1, false);
> + auto *V = new Argument(Type::getInt32Ty(Ctx));
> + Function *F = Function::Create(FT, Function::ExternalLinkage, "", M.get());
> +
> + Value *DbgAddr = Intrinsic::getDeclaration(M.get(), Intrinsic::dbg_addr);
> + Value *DbgDeclare =
> + Intrinsic::getDeclaration(M.get(), Intrinsic::dbg_declare);
> + Value *DbgValue = Intrinsic::getDeclaration(M.get(), Intrinsic::dbg_value);
> + Value *DIV = MetadataAsValue::get(Ctx, (Metadata *)nullptr);
> + SmallVector<Value *, 3> Args = {DIV, DIV, DIV};
> +
> + BasicBlock *BB1 = BasicBlock::Create(Ctx, "", F);
> + const BasicBlock *BBConst = BB1;
> + IRBuilder<> Builder1(BB1);
> +
> + AllocaInst *Var = Builder1.CreateAlloca(Builder1.getInt8Ty());
> + Builder1.CreateCall(DbgValue, Args);
> + Instruction *AddInst = cast<Instruction>(Builder1.CreateAdd(V, V));
> + Instruction *MulInst = cast<Instruction>(Builder1.CreateMul(AddInst, V));
> + Builder1.CreateCall(DbgDeclare, Args);
> + Instruction *SubInst = cast<Instruction>(Builder1.CreateSub(MulInst, V));
> + Builder1.CreateCall(DbgAddr, Args);
> +
> + SmallVector<Instruction *, 4> Exp = {Var, AddInst, MulInst, SubInst};
> + CHECK_ITERATORS(BB1->instructionsWithoutDebug(), Exp);
> + CHECK_ITERATORS(BBConst->instructionsWithoutDebug(), Exp);
> +}
> +
> } // End anonymous namespace.
> } // End llvm namespace.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list