Index: lib/CodeGen/Analysis.cpp =================================================================== --- lib/CodeGen/Analysis.cpp +++ lib/CodeGen/Analysis.cpp @@ -295,9 +295,8 @@ } else if (const InsertValueInst *IVI = dyn_cast(V)) { // Value may come from either the aggregate or the scalar ArrayRef InsertLoc = IVI->getIndices(); - assert(ValLoc.size() >= InsertLoc.size() && "extracting too deeply"); - if (std::equal(InsertLoc.begin(), InsertLoc.end(), - ValLoc.rbegin())) { + if (ValLoc.size() >= InsertLoc.size() && + std::equal(InsertLoc.begin(), InsertLoc.end(), ValLoc.rbegin())) { // The type being inserted is a nested sub-type of the aggregate; we // have to remove those initial indices to get the location we're // interested in for the operand. Index: test/CodeGen/AArch64/tail-call.ll =================================================================== --- test/CodeGen/AArch64/tail-call.ll +++ test/CodeGen/AArch64/tail-call.ll @@ -122,3 +122,22 @@ %res.012 = insertvalue { [3 x float] } %res.01, float 1.000000e+00, 0, 2 ret { [3 x float] } %res.012 } + +declare double @get_double() +define { double, [2 x double] } @test_mismatched_insert() { +; CHECK-LABEL: test_mismatched_insert: +; CHECK: bl get_double +; CHECK: bl get_double +; CHECK: bl get_double +; CHECK: ret + + %val0 = call double @get_double() + %val1 = call double @get_double() + %val2 = tail call double @get_double() + + %res.0 = insertvalue { double, [2 x double] } undef, double %val0, 0 + %res.01 = insertvalue { double, [2 x double] } %res.0, double %val1, 1, 0 + %res.012 = insertvalue { double, [2 x double] } %res.01, double %val2, 1, 1 + + ret { double, [2 x double] } %res.012 +}