aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGStmt.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-05-22 01:22:33 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-05-22 01:22:33 +0000
commit144ac61f9005a0da4327d4e62a4c453923b7bc0c (patch)
treefaf062b5a2a517c542e01a99f30c6c0c3df511eb /lib/CodeGen/CGStmt.cpp
parent963fcb0737aebe929e58967e60b1c9e7cf9d330e (diff)
Minor refactoring: compute the return value separately from emitting the
ret. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51403 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGStmt.cpp')
-rw-r--r--lib/CodeGen/CGStmt.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp
index 7986b4a113..2e36c5b704 100644
--- a/lib/CodeGen/CGStmt.cpp
+++ b/lib/CodeGen/CGStmt.cpp
@@ -360,18 +360,21 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
// Emit the result value, even if unused, to evalute the side effects.
const Expr *RV = S.getRetValue();
+ llvm::Value* RetValue = 0;
if (FnRetTy->isVoidType()) {
- // If the function returns void, emit ret void.
- Builder.CreateRetVoid();
+ // Make sure not to return anything
+ if (RV) {
+ // Evaluate the expression for side effects
+ EmitAnyExpr(RV);
+ }
} else if (RV == 0) {
- // Handle "return;" in a function that returns a value.
const llvm::Type *RetTy = CurFn->getFunctionType()->getReturnType();
- if (RetTy == llvm::Type::VoidTy)
- Builder.CreateRetVoid(); // struct return etc.
- else
- Builder.CreateRet(llvm::UndefValue::get(RetTy));
+ if (RetTy != llvm::Type::VoidTy) {
+ // Handle "return;" in a function that returns a value.
+ RetValue = llvm::UndefValue::get(RetTy);
+ }
} else if (!hasAggregateLLVMType(RV->getType())) {
- Builder.CreateRet(EmitScalarExpr(RV));
+ RetValue = EmitScalarExpr(RV);
} else if (RV->getType()->isAnyComplexType()) {
llvm::Value *SRetPtr = CurFn->arg_begin();
EmitComplexExprIntoAddr(RV, SRetPtr, false);
@@ -379,6 +382,12 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
llvm::Value *SRetPtr = CurFn->arg_begin();
EmitAggExpr(RV, SRetPtr, false);
}
+
+ if (RetValue) {
+ Builder.CreateRet(RetValue);
+ } else {
+ Builder.CreateRetVoid();
+ }
// Emit a block after the branch so that dead code after a return has some
// place to go.