Index: lib/CodeGen/Analysis.cpp =================================================================== --- lib/CodeGen/Analysis.cpp +++ lib/CodeGen/Analysis.cpp @@ -295,7 +295,8 @@ } else if (const InsertValueInst *IVI = dyn_cast(V)) { // Value may come from either the aggregate or the scalar ArrayRef InsertLoc = IVI->getIndices(); - if (std::equal(InsertLoc.rbegin(), InsertLoc.rend(), + assert(ValLoc.size() >= InsertLoc.size() && "extracting too deeply"); + if (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 Index: test/CodeGen/AArch64/tail-call.ll =================================================================== --- test/CodeGen/AArch64/tail-call.ll +++ test/CodeGen/AArch64/tail-call.ll @@ -103,3 +103,22 @@ tail call void @callee_weak() ret void } + +declare { [2 x float] } @get_vec2() + +define { [3 x float] } @test_add_elem() { +; CHECK-LABEL: test_add_elem: +; CHECK: bl get_vec2 +; CHECK: fmov s2, #1.0 +; CHECK: ret + + %call = tail call { [2 x float] } @get_vec2() + %arr = extractvalue { [2 x float] } %call, 0 + %arr.0 = extractvalue [2 x float] %arr, 0 + %arr.1 = extractvalue [2 x float] %arr, 1 + + %res.0 = insertvalue { [3 x float] } undef, float %arr.0, 0, 0 + %res.01 = insertvalue { [3 x float] } %res.0, float %arr.1, 0, 1 + %res.012 = insertvalue { [3 x float] } %res.01, float 1.000000e+00, 0, 2 + ret { [3 x float] } %res.012 +}