From: Eli Friedman Date: Thu, 22 May 2008 01:22:33 +0000 (+0000) Subject: Minor refactoring: compute the return value separately from emitting the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=144ac61f9005a0da4327d4e62a4c453923b7bc0c;p=clang 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 --- 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.