1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

Correct extractelement constant folding

Summary: Constant folding of extractelement with out-of-bound index produces undef also for indexes bigger than 64bit (instead of crash assert failure as before)

Test Plan: Unit tests included.

Reviewers: majnemer

Reviewed By: majnemer

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D9225

llvm-svn: 235700
This commit is contained in:
Pawel Bylica 2015-04-24 07:42:35 +00:00
parent f959036c26
commit a0b176b76b
2 changed files with 10 additions and 3 deletions

View File

@ -789,11 +789,10 @@ Constant *llvm::ConstantFoldExtractElementInstruction(Constant *Val,
return UndefValue::get(Val->getType()->getVectorElementType());
if (ConstantInt *CIdx = dyn_cast<ConstantInt>(Idx)) {
uint64_t Index = CIdx->getZExtValue();
// ee({w,x,y,z}, wrong_value) -> undef
if (Index >= Val->getType()->getVectorNumElements())
if (CIdx->uge(Val->getType()->getVectorNumElements()))
return UndefValue::get(Val->getType()->getVectorElementType());
return Val->getAggregateElement(Index);
return Val->getAggregateElement(CIdx->getZExtValue());
}
return nullptr;
}

View File

@ -187,6 +187,10 @@ TEST(ConstantsTest, AsInstructionsTest) {
Constant *P6 = ConstantExpr::getBitCast(P4, VectorType::get(Int16Ty, 2));
Constant *One = ConstantInt::get(Int32Ty, 1);
Constant *Two = ConstantInt::get(Int64Ty, 2);
Constant *Big = ConstantInt::get(getGlobalContext(),
APInt{256, uint64_t(-1), true});
Constant *Undef = UndefValue::get(Int64Ty);
#define P0STR "ptrtoint (i32** @dummy to i32)"
#define P1STR "uitofp (i32 ptrtoint (i32** @dummy to i32) to float)"
@ -255,6 +259,10 @@ TEST(ConstantsTest, AsInstructionsTest) {
CHECK(ConstantExpr::getExtractElement(P6, One), "extractelement <2 x i16> "
P6STR ", i32 1");
EXPECT_TRUE(isa<UndefValue>(ConstantExpr::getExtractElement(P6, Two)));
EXPECT_TRUE(isa<UndefValue>(ConstantExpr::getExtractElement(P6, Big)));
EXPECT_TRUE(isa<UndefValue>(ConstantExpr::getExtractElement(P6, Undef)));
}
#ifdef GTEST_HAS_DEATH_TEST