EVT VT = InVec.getValueType();
unsigned NumElts = VT.getVectorNumElements();
+ // Insert into out-of-bounds element is undefined.
+ if (auto *IndexC = dyn_cast<ConstantSDNode>(EltNo))
+ if (IndexC->getZExtValue() >= VT.getVectorNumElements())
+ return DAG.getUNDEF(VT);
+
// Remove redundant insertions:
// (insert_vector_elt x (extract_vector_elt x idx) idx) -> x
if (InVal.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
ret <4 x double> %ins
}
+; Don't die trying to insert to an invalid index.
+
+define i32 @PR44139(<16 x i64>* %p) {
+; ALL-LABEL: PR44139:
+; ALL: # %bb.0:
+; ALL-NEXT: movl (%rdi), %eax
+; ALL-NEXT: leal 2147483647(%rax), %ecx
+; ALL-NEXT: testl %eax, %eax
+; ALL-NEXT: cmovnsl %eax, %ecx
+; ALL-NEXT: andl $-2147483648, %ecx # imm = 0x80000000
+; ALL-NEXT: addl %eax, %ecx
+; ALL-NEXT: # kill: def $eax killed $eax killed $rax
+; ALL-NEXT: xorl %edx, %edx
+; ALL-NEXT: divl %ecx
+; ALL-NEXT: retq
+ %L = load <16 x i64>, <16 x i64>* %p
+ %E1 = extractelement <16 x i64> %L, i64 0
+ %tempvector = insertelement <16 x i64> undef, i64 %E1, i32 0
+ %vector = shufflevector <16 x i64> %tempvector, <16 x i64> undef, <16 x i32> zeroinitializer
+ %C3 = icmp sgt i64 9223372036854775807, -9223372036854775808
+ %t0 = trunc <16 x i64> %vector to <16 x i32>
+ %I4 = insertelement <16 x i64> %vector, i64 %E1, i1 %C3
+ store <16 x i64> %I4, <16 x i64>* %p
+ %elt = extractelement <16 x i32> %t0, i32 0
+ %B = srem i32 %elt, -2147483648
+ %B9 = udiv i32 %elt, %B
+ ret i32 %B9
+}
; X32-LABEL: ossfuzz15662:
; X32: # %bb.0:
; X32-NEXT: xorps %xmm0, %xmm0
-; X32-NEXT: movaps %xmm0, (%eax)
-; X32-NEXT: xorps %xmm0, %xmm0
; X32-NEXT: retl
;
; X64-LABEL: ossfuzz15662:
; X64: # %bb.0:
; X64-NEXT: xorps %xmm0, %xmm0
-; X64-NEXT: movaps %xmm0, (%rax)
-; X64-NEXT: xorps %xmm0, %xmm0
; X64-NEXT: retq
%C10 = icmp ule i1 false, false
%C3 = icmp ule i1 true, undef