summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-06-20 01:03:44 +0000
committerDan Gohman <gohman@apple.com>2008-06-20 01:03:44 +0000
commit3b18fd7b02f64b815c0693874c6de1cb9f382b1c (patch)
tree5c30669093ad58a100a7471f46b6368f67b97706 /llvm/lib
parent9598f930f3aeedbb3c3ca39ce9ad6ad4d4ab6644 (diff)
downloadbcm5719-llvm-3b18fd7b02f64b815c0693874c6de1cb9f382b1c.tar.gz
bcm5719-llvm-3b18fd7b02f64b815c0693874c6de1cb9f382b1c.zip
Teach InlineFunction how to differentiate between multiple-value
return statements and aggregate returns so that it handles both correctly. llvm-svn: 52519
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Utils/InlineFunction.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 2ed335c95c1..e917dc80b58 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -443,8 +443,9 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
// uses of the returned value.
if (!TheCall->use_empty()) {
ReturnInst *R = Returns[0];
- if (isa<StructType>(TheCall->getType())) {
- // Multiple return values.
+ if (isa<StructType>(TheCall->getType()) &&
+ TheCall->getType() != R->getOperand(0)->getType()) {
+ // Multiple-value return statements.
while (!TheCall->use_empty()) {
GetResultInst *GR = cast<GetResultInst>(TheCall->use_back());
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.
const Type *RTy = CalledFunc->getReturnType();
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) {
// The PHI node should go at the front of the new basic block to merge all
// possible incoming values.
OpenPOWER on IntegriCloud