From: Daniel Dunbar Date: Fri, 20 Feb 2009 18:54:31 +0000 (+0000) Subject: Take advantage of noreturn attribute to add unreachable instruction & X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f4fe0f082f21048c0777ad5aeac04a5a94db1f46;p=clang Take advantage of noreturn attribute to add unreachable instruction & clear insertion point. The rest of IRgen should theoretically take advantage of this to avoid emitting dead code. Theory != Practice. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65141 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index d0122fa4f9..02e00558d8 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1760,6 +1760,18 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, if (const llvm::Function *F = dyn_cast(Callee)) CI->setCallingConv(F->getCallingConv()); + + // If the call doesn't return, finish the basic block and clear the + // insertion point; this allows the rest of IRgen to discard + // unreachable code. + if (CI->doesNotReturn()) { + Builder.CreateUnreachable(); + Builder.ClearInsertionPoint(); + + // Return a reasonable RValue. + return GetUndefRValue(RetTy); + } + if (CI->getType() != llvm::Type::VoidTy) CI->setName("call");