Index: llvm/trunk/lib/Analysis/InstructionSimplify.cpp =================================================================== --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp @@ -3901,6 +3901,11 @@ 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(Idx)) + return UndefValue::get(Vec->getType()->getVectorElementType()); + return nullptr; } Index: llvm/trunk/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll =================================================================== --- llvm/trunk/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll +++ llvm/trunk/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll @@ -46,3 +46,10 @@ ; 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