From: Sanjay Patel Date: Sun, 26 May 2019 14:03:50 +0000 (+0000) Subject: [InstCombine] prevent crashing with invalid extractelement index X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=898c7f2bca9b3d72e4d3e5b724ca62a956fb1133;p=llvm [InstCombine] prevent crashing with invalid extractelement index This was found/reduced from a fuzzer report: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14956 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361729 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index 308569395a9..d812c5b83d1 100644 --- a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -878,12 +878,13 @@ Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) { } // If the inserted element was extracted from some other vector and both - // indexes are constant, try to turn this into a shuffle. + // indexes are valid constants, try to turn this into a shuffle. uint64_t InsertedIdx, ExtractedIdx; Value *ExtVecOp; if (match(IdxOp, m_ConstantInt(InsertedIdx)) && match(ScalarOp, m_ExtractElement(m_Value(ExtVecOp), - m_ConstantInt(ExtractedIdx)))) { + m_ConstantInt(ExtractedIdx))) && + ExtractedIdx < ExtVecOp->getType()->getVectorNumElements()) { // TODO: Looking at the user(s) to determine if this insert is a // fold-to-shuffle opportunity does not match the usual instcombine // constraints. We should decide if the transform is worthy based only diff --git a/test/Transforms/InstCombine/extractelement.ll b/test/Transforms/InstCombine/extractelement.ll index 5d6a3a1c355..b1f57060b02 100644 --- a/test/Transforms/InstCombine/extractelement.ll +++ b/test/Transforms/InstCombine/extractelement.ll @@ -310,3 +310,22 @@ define float @bitcasted_inselt_to_and_from_FP_uses2(double %x) { ret float %r } +; This would crash/assert because the logic for collectShuffleElements() +; does not consider the possibility of invalid insert/extract operands. + +define <4 x double> @invalid_extractelement(<2 x double> %a, <4 x double> %b, double* %p) { +; ANY-LABEL: @invalid_extractelement( +; ANY-NEXT: [[TMP1:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> undef, <4 x i32> +; ANY-NEXT: [[T4:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[TMP1]], <4 x i32> +; ANY-NEXT: [[E:%.*]] = extractelement <4 x double> [[B]], i32 1 +; ANY-NEXT: store double [[E]], double* [[P:%.*]], align 8 +; ANY-NEXT: ret <4 x double> [[T4]] +; + %t3 = extractelement <2 x double> %a, i32 0 + %t4 = insertelement <4 x double> %b, double %t3, i32 2 + %e = extractelement <4 x double> %t4, i32 1 + store double %e, double* %p + %e1 = extractelement <2 x double> %a, i32 4 ; invalid index + %r = insertelement <4 x double> %t4, double %e1, i64 0 + ret <4 x double> %r +}