From f4fe0f082f21048c0777ad5aeac04a5a94db1f46 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 20 Feb 2009 18:54:31 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGCall.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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"); -- 2.40.0