forked from OSchip/llvm-project
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:
parent
a659d2590e
commit
2e6e88f689
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue