[IR] Add range accessors for the indices of a GEP instruction.

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
This commit is contained in:
Chandler Carruth 2017-02-28 08:04:20 +00:00
parent c986f8765a
commit d1c95b67ba
2 changed files with 43 additions and 0 deletions

View File

@ -958,6 +958,14 @@ public:
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);
}

View File

@ -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