diff --git a/lib/CodeGen/Analysis.cpp b/lib/CodeGen/Analysis.cpp index 8e11fe1c9cf..ac0d40ec3a7 100644 --- a/lib/CodeGen/Analysis.cpp +++ b/lib/CodeGen/Analysis.cpp @@ -295,7 +295,8 @@ static const Value *getNoopInput(const Value *V, } 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 diff --git a/test/CodeGen/AArch64/tail-call.ll b/test/CodeGen/AArch64/tail-call.ll index 7fb39545a32..700eec77636 100644 --- a/test/CodeGen/AArch64/tail-call.ll +++ b/test/CodeGen/AArch64/tail-call.ll @@ -103,3 +103,22 @@ define fastcc void @caller_weak() { 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 +}