[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:
parent
c986f8765a
commit
d1c95b67ba
|
@ -958,6 +958,14 @@ public:
|
||||||
inline op_iterator idx_end() { return op_end(); }
|
inline op_iterator idx_end() { return op_end(); }
|
||||||
inline const_op_iterator idx_end() const { 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() {
|
Value *getPointerOperand() {
|
||||||
return getOperand(0);
|
return getOperand(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 anonymous namespace
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
Loading…
Reference in New Issue