diff options
author | Dan Gohman <dan433584@gmail.com> | 2019-08-30 04:33:22 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2019-08-30 04:33:22 +0000 |
commit | 8cfeeaf9de0b24248be1074c7593107c748cc16c (patch) | |
tree | 404588e3b8a1b9f8525ebfb406ea6c94e51ad238 /llvm/lib | |
parent | bd0f840f83e56d36ace49b04b499f107be7eb492 (diff) | |
download | bcm5719-llvm-8cfeeaf9de0b24248be1074c7593107c748cc16c.tar.gz bcm5719-llvm-8cfeeaf9de0b24248be1074c7593107c748cc16c.zip |
[CodeGen] Fix lowering for returning the result of an extractvalue
When the number of return values exceeds the number of registers available,
SelectionDAGBuilder::visitRet transforms a function's return to use a
pointer to a buffer to hold return values. When the returned value is an
operator such as extractvalue, the value may have a non-zero result number.
Add that number to the indexing when obtaining the values to store.
This fixes https://bugs.llvm.org/show_bug.cgi?id=43132.
Differential Revision: https://reviews.llvm.org/D66978
llvm-svn: 370430
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 105fb42de61..d4bed14175c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1809,7 +1809,7 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) { // offsets to its parts don't wrap either. SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr, Offsets[i]); - SDValue Val = RetOp.getValue(i); + SDValue Val = RetOp.getValue(RetOp.getResNo() + i); if (MemVTs[i] != ValueVTs[i]) Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]); Chains[i] = DAG.getStore(Chain, getCurSDLoc(), Val, |