mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-04 18:58:44 +00:00
Teach InlineFunction how to differentiate between multiple-value
return statements and aggregate returns so that it handles both correctly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52519 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
88d11c03cd
commit
2c31750cd0
@ -443,8 +443,9 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
|
|||||||
// uses of the returned value.
|
// uses of the returned value.
|
||||||
if (!TheCall->use_empty()) {
|
if (!TheCall->use_empty()) {
|
||||||
ReturnInst *R = Returns[0];
|
ReturnInst *R = Returns[0];
|
||||||
if (isa<StructType>(TheCall->getType())) {
|
if (isa<StructType>(TheCall->getType()) &&
|
||||||
// Multiple return values.
|
TheCall->getType() != R->getOperand(0)->getType()) {
|
||||||
|
// Multiple-value return statements.
|
||||||
while (!TheCall->use_empty()) {
|
while (!TheCall->use_empty()) {
|
||||||
GetResultInst *GR = cast<GetResultInst>(TheCall->use_back());
|
GetResultInst *GR = cast<GetResultInst>(TheCall->use_back());
|
||||||
Value *RV = R->getOperand(GR->getIndex());
|
Value *RV = R->getOperand(GR->getIndex());
|
||||||
@ -509,6 +510,13 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
|
|||||||
// any users of the original call/invoke instruction.
|
// any users of the original call/invoke instruction.
|
||||||
const Type *RTy = CalledFunc->getReturnType();
|
const Type *RTy = CalledFunc->getReturnType();
|
||||||
const StructType *STy = dyn_cast<StructType>(RTy);
|
const StructType *STy = dyn_cast<StructType>(RTy);
|
||||||
|
|
||||||
|
// We do special handling for multiple-value return statements. If this is
|
||||||
|
// a plain aggregate return, don't do the special handling.
|
||||||
|
if (!Returns.empty() && Returns[0]->getNumOperands() != 0 &&
|
||||||
|
Returns[0]->getOperand(0)->getType() == STy)
|
||||||
|
STy = 0;
|
||||||
|
|
||||||
if (Returns.size() > 1 || STy) {
|
if (Returns.size() > 1 || STy) {
|
||||||
// The PHI node should go at the front of the new basic block to merge all
|
// The PHI node should go at the front of the new basic block to merge all
|
||||||
// possible incoming values.
|
// possible incoming values.
|
||||||
|
Loading…
Reference in New Issue
Block a user