Author: rjmccall Date: Wed Apr 10 10:03:09 2019 New Revision: 358104 URL: http://llvm.org/viewvc/llvm-project?rev=358104&view=rev Log: Don't emit an unreachable return block.
Patch by Brad Moody. Added: cfe/trunk/test/CodeGen/unreachable-ret.c Modified: cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=358104&r1=358103&r2=358104&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Apr 10 10:03:09 2019 @@ -2873,15 +2873,6 @@ void CodeGenFunction::EmitFunctionEpilog RV = SI->getValueOperand(); SI->eraseFromParent(); - // If that was the only use of the return value, nuke it as well now. - auto returnValueInst = ReturnValue.getPointer(); - if (returnValueInst->use_empty()) { - if (auto alloca = dyn_cast<llvm::AllocaInst>(returnValueInst)) { - alloca->eraseFromParent(); - ReturnValue = Address::invalid(); - } - } - // Otherwise, we have to do a simple load. } else { RV = Builder.CreateLoad(ReturnValue); Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=358104&r1=358103&r2=358104&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Apr 10 10:03:09 2019 @@ -255,6 +255,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) { ReturnBlock.getBlock()->replaceAllUsesWith(CurBB); delete ReturnBlock.getBlock(); + ReturnBlock = JumpDest(); } else EmitBlock(ReturnBlock.getBlock()); return llvm::DebugLoc(); @@ -274,6 +275,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu Builder.SetInsertPoint(BI->getParent()); BI->eraseFromParent(); delete ReturnBlock.getBlock(); + ReturnBlock = JumpDest(); return Loc; } } @@ -448,6 +450,19 @@ void CodeGenFunction::FinishFunction(Sou // 5. Width of vector aguments and return types for functions called by this // function. CurFn->addFnAttr("min-legal-vector-width", llvm::utostr(LargestVectorWidth)); + + // If we generated an unreachable return block, delete it now. + if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) { + Builder.ClearInsertionPoint(); + ReturnBlock.getBlock()->eraseFromParent(); + } + if (ReturnValue.isValid()) { + auto *RetAlloca = dyn_cast<llvm::AllocaInst>(ReturnValue.getPointer()); + if (RetAlloca && RetAlloca->use_empty()) { + RetAlloca->eraseFromParent(); + ReturnValue = Address::invalid(); + } + } } /// ShouldInstrumentFunction - Return true if the current function should be Added: cfe/trunk/test/CodeGen/unreachable-ret.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/unreachable-ret.c?rev=358104&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/unreachable-ret.c (added) +++ cfe/trunk/test/CodeGen/unreachable-ret.c Wed Apr 10 10:03:09 2019 @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s + +extern void abort() __attribute__((noreturn)); + +void f1() { + abort(); +} +// CHECK-LABEL: define void @f1() +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @abort() +// CHECK-NEXT: unreachable +// CHECK-NEXT: } + +void *f2() { + abort(); + return 0; +} +// CHECK-LABEL: define i8* @f2() +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @abort() +// CHECK-NEXT: unreachable +// CHECK-NEXT: } + Modified: cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp?rev=358104&r1=358103&r2=358104&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp Wed Apr 10 10:03:09 2019 @@ -622,7 +622,7 @@ int main() { // CHECK-NOT: call i32 @__kmpc_reduce -// CHECK: ret void +// CHECK: } // CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]() // CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]], _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits