]> granicus.if.org Git - llvm/commitdiff
InstructionSimplify: 'extractelement' with an undef index is undef
authorZvi Rackover <zvi.rackover@intel.com>
Wed, 6 Dec 2017 17:51:46 +0000 (17:51 +0000)
committerZvi Rackover <zvi.rackover@intel.com>
Wed, 6 Dec 2017 17:51:46 +0000 (17:51 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319910 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll

index 622b1f25df6284f2360445181abdb02bbdfb0dfc..09f516a8cb9bd4a2d73cd7e4302261c89213e9b5 100644 (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;
 }
 
index 441bc1adca7e36b75739a2ced4aab69d6dda31a4..2c35ed7f390955f09c4fed7219ef18e67aa858d5 100644 (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