Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -781,6 +781,10 @@ Value *ScalarOp = IE.getOperand(1); Value *IdxOp = IE.getOperand(2); + if (auto *V = SimplifyInsertElementInst( + VecOp, ScalarOp, IdxOp, SQ.getWithInstruction(&IE))) + return replaceInstUsesWith(IE, V); + // Inserting an undef or into an undefined place, remove this. if (isa(ScalarOp) || isa(IdxOp)) replaceInstUsesWith(IE, VecOp); Index: llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll +++ llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll @@ -31,3 +31,11 @@ } declare void @llvm.assume(i1) + +define <4 x double> @inselt_bad_index(<4 x double> %a) { +; CHECK-LABEL: @inselt_bad_index( +; CHECK-NEXT: ret <4 x double> undef +; + %I = insertelement <4 x double> %a, double 0.0, i64 4294967296 + ret <4 x double> %I +} Index: llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll +++ llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll @@ -54,10 +54,10 @@ ret <4 x float> %ins6 } +; Out of bounds index folds to undef define <4 x float> @bazzz(<4 x float> %x) { ; CHECK-LABEL: @bazzz( -; CHECK-NEXT: [[INS2:%.*]] = insertelement <4 x float> %x, float 2.000000e+00, i32 2 -; CHECK-NEXT: ret <4 x float> [[INS2]] +; CHECK-NEXT: ret <4 x float> ; %ins1 = insertelement<4 x float> %x, float 1.0, i32 5 %ins2 = insertelement<4 x float> %ins1, float 2.0, i32 2