InstructionSimplify: 'extractelement' with an undef index is undef

Summary:
An undef extract index can be arbitrarily chosen to be an
out-of-range index value, which would result in the instruction being undef.

This change closes a gap identified while working on lowering vector permute intrinsics
with variable index vectors to pure LLVM IR.

Reviewers: arsenm, spatel, majnemer

Reviewed By: arsenm, spatel

Subscribers: fhahn, nhaehnle, wdng, llvm-commits

Differential Revision: https://reviews.llvm.org/D40231

llvm-svn: 319910
This commit is contained in:
Zvi Rackover 2017-12-06 17:51:46 +00:00
parent a659d2590e
commit 2e6e88f689
2 changed files with 12 additions and 0 deletions

View File

@ -3901,6 +3901,11 @@ static Value *SimplifyExtractElementInst(Value *Vec, Value *Idx, const SimplifyQ
if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue()))
return Elt;
// An undef extract index can be arbitrarily chosen to be an out-of-range
// index value, which would result in the instruction being undef.
if (isa<UndefValue>(Idx))
return UndefValue::get(Vec->getType()->getVectorElementType());
return nullptr;
}

View File

@ -46,3 +46,10 @@ define i8 @test4(<8 x i8> %V) {
; CHECK-NEXT: %[[extract:.*]] = extractelement <8 x i8> %[[add]], i32 6
; CHECK-NEXT: ret i8 %[[extract]]
}
define i32 @test5(<4 x i32> %V) {
%extract = extractelement <4 x i32> %V, i32 undef
ret i32 %extract
}
; CHECK-LABEL: @test5(
; CHECK: ret i32 undef