mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
CodeGen: match up correct insertvalue indices when assessing tail calls.
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
This commit is contained in:
parent
c41c3a4c3b
commit
7f88b179b1
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user