forked from OSchip/llvm-project
Don't emit an unreachable return block.
Patch by Brad Moody. llvm-svn: 358104
This commit is contained in:
parent
e1b9b9dc15
commit
8b36ac818c
|
@ -2873,15 +2873,6 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
|
|||
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);
|
||||
|
|
|
@ -255,6 +255,7 @@ llvm::DebugLoc CodeGenFunction::EmitReturnBlock() {
|
|||
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::EmitReturnBlock() {
|
|||
Builder.SetInsertPoint(BI->getParent());
|
||||
BI->eraseFromParent();
|
||||
delete ReturnBlock.getBlock();
|
||||
ReturnBlock = JumpDest();
|
||||
return Loc;
|
||||
}
|
||||
}
|
||||
|
@ -448,6 +450,19 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
|
|||
// 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
|
||||
|
|
|
@ -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: }
|
||||
|
|
@ -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]],
|
||||
|
|
Loading…
Reference in New Issue