Skip to content

Commit

Permalink
[IR] Add range accessors for the indices of a GEP instruction.
Browse files Browse the repository at this point in the history
These were noticed as missing in a code review. Add them and the boring
unit test to make sure they compile and DTRT.

llvm-svn: 296444
  • Loading branch information
chandlerc committed Feb 28, 2017
1 parent c986f87 commit d1c95b6
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
8 changes: 8 additions & 0 deletions llvm/include/llvm/IR/Instructions.h
Original file line number Diff line number Diff line change
Expand Up @@ -958,6 +958,14 @@ class GetElementPtrInst : public Instruction {
inline op_iterator idx_end() { return op_end(); }
inline const_op_iterator idx_end() const { return op_end(); }

inline iterator_range<op_iterator> indices() {
return make_range(idx_begin(), idx_end());
}

inline iterator_range<const_op_iterator> indices() const {
return make_range(idx_begin(), idx_end());
}

Value *getPointerOperand() {
return getOperand(0);
}
Expand Down
35 changes: 35 additions & 0 deletions llvm/unittests/IR/InstructionsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -640,5 +640,40 @@ TEST_F(ModuleWithFunctionTest, DropPoisonGeneratingFlags) {
}
}

TEST(InstructionsTest, GEPIndices) {
LLVMContext Context;
IRBuilder<NoFolder> Builder(Context);
Type *ElementTy = Builder.getInt8Ty();
Type *ArrTy = ArrayType::get(ArrayType::get(ElementTy, 64), 64);
Value *Indices[] = {
Builder.getInt32(0),
Builder.getInt32(13),
Builder.getInt32(42) };

Value *V = Builder.CreateGEP(ArrTy, UndefValue::get(PointerType::getUnqual(ArrTy)),
Indices);
ASSERT_TRUE(isa<GetElementPtrInst>(V));

auto *GEPI = cast<GetElementPtrInst>(V);
ASSERT_NE(GEPI->idx_begin(), GEPI->idx_end());
ASSERT_EQ(GEPI->idx_end(), std::next(GEPI->idx_begin(), 3));
EXPECT_EQ(Indices[0], GEPI->idx_begin()[0]);
EXPECT_EQ(Indices[1], GEPI->idx_begin()[1]);
EXPECT_EQ(Indices[2], GEPI->idx_begin()[2]);
EXPECT_EQ(GEPI->idx_begin(), GEPI->indices().begin());
EXPECT_EQ(GEPI->idx_end(), GEPI->indices().end());

const auto *CGEPI = GEPI;
ASSERT_NE(CGEPI->idx_begin(), CGEPI->idx_end());
ASSERT_EQ(CGEPI->idx_end(), std::next(CGEPI->idx_begin(), 3));
EXPECT_EQ(Indices[0], CGEPI->idx_begin()[0]);
EXPECT_EQ(Indices[1], CGEPI->idx_begin()[1]);
EXPECT_EQ(Indices[2], CGEPI->idx_begin()[2]);
EXPECT_EQ(CGEPI->idx_begin(), CGEPI->indices().begin());
EXPECT_EQ(CGEPI->idx_end(), CGEPI->indices().end());

delete GEPI;
}

} // end anonymous namespace
} // end namespace llvm

0 comments on commit d1c95b6

Please sign in to comment.