} 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
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
+}