CodeGen: match up correct insertvalue indices when assessing tail calls.
authorTim Northover <tnorthover@apple.com>
Mon, 4 May 2015 20:41:51 +0000 (20:41 +0000)
committerTim Northover <tnorthover@apple.com>
Mon, 4 May 2015 20:41:51 +0000 (20:41 +0000)
When deciding whether a value comes from the aggregate or inserted value of an
insertvalue instruction, we compare the indices against those of the location
we're interested in. One of the lists needs reversing because the input data is
backwards (so that modifications take place at the end of the SmallVector), but
we were reversing both before leading to incorrect results.

Should fix PR23408

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236457 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Analysis.cpp
test/CodeGen/AArch64/tail-call.ll

index 8e11fe1c9cf4ca4042e47d44bba7e6f448b70fb9..ac0d40ec3a7a01f648bf798f3044b66e08d5c8e2 100644 (file)
@@ -295,7 +295,8 @@ static const Value *getNoopInput(const Value *V,
     } else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(V)) {
       // Value may come from either the aggregate or the scalar
       ArrayRef<unsigned> 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 7fb39545a32e91b55e984845bcd5fbfb2885a709..700eec7763610e2ae5f5b09ddcec892359e57fd3 100644 (file)
@@ -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
+}