Do not codegen dummy block.

Dummy block is an empty block with no predecessors.

llvm-svn: 42451
This commit is contained in:
Devang Patel 2007-09-28 21:49:18 +00:00
parent 14851c3de3
commit 8ec4f837fa
3 changed files with 40 additions and 10 deletions

View File

@ -131,13 +131,25 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
// Emit the 'then' code.
EmitBlock(ThenBlock);
EmitStmt(S.getThen());
Builder.CreateBr(ContBlock);
llvm::BasicBlock *BB = Builder.GetInsertBlock();
if (isDummyBlock(BB)) {
BB->eraseFromParent();
Builder.SetInsertPoint(ThenBlock);
}
else
Builder.CreateBr(ContBlock);
// Emit the 'else' code if present.
if (const Stmt *Else = S.getElse()) {
EmitBlock(ElseBlock);
EmitStmt(Else);
Builder.CreateBr(ContBlock);
llvm::BasicBlock *BB = Builder.GetInsertBlock();
if (isDummyBlock(BB)) {
BB->eraseFromParent();
Builder.SetInsertPoint(ElseBlock);
}
else
Builder.CreateBr(ContBlock);
}
// Emit the continuation block for code after the if.

View File

@ -19,6 +19,7 @@
#include "llvm/DerivedTypes.h"
#include "llvm/Function.h"
#include "llvm/Analysis/Verifier.h"
#include "llvm/Support/CFG.h"
using namespace clang;
using namespace CodeGen;
@ -87,13 +88,18 @@ void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
// Emit the function body.
EmitStmt(FD->getBody());
// Emit a return for code that falls off the end.
// FIXME: if this is C++ main, this should return 0.
if (CurFn->getReturnType() == llvm::Type::VoidTy)
Builder.CreateRetVoid();
else
Builder.CreateRet(llvm::UndefValue::get(CurFn->getReturnType()));
// Emit a return for code that falls off the end. If insert point
// is a dummy block with no predecessors then remove the block itself.
llvm::BasicBlock *BB = Builder.GetInsertBlock();
if (isDummyBlock(BB))
BB->eraseFromParent();
else {
// FIXME: if this is C++ main, this should return 0.
if (CurFn->getReturnType() == llvm::Type::VoidTy)
Builder.CreateRetVoid();
else
Builder.CreateRet(llvm::UndefValue::get(CurFn->getReturnType()));
}
assert(BreakContinueStack.empty() &&
"mismatched push/pop in break/continue stack!");
@ -101,3 +107,11 @@ void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
assert(!verifyFunction(*CurFn));
}
/// isDummyBlock - Return true if BB is an empty basic block
/// with no predecessors.
bool CodeGenFunction::isDummyBlock(const llvm::BasicBlock *BB) {
if (BB->empty() && pred_begin(BB) == pred_end(BB))
return true;
return false;
}

View File

@ -276,7 +276,11 @@ public:
/// the result should be returned.
RValue EmitAnyExpr(const Expr *E, llvm::Value *AggLoc = 0,
bool isAggLocVolatile = false);
/// isDummyBlock - Return true if BB is an empty basic block
/// with no predecessors.
static bool isDummyBlock(const llvm::BasicBlock *BB);
//===--------------------------------------------------------------------===//
// Declaration Emission
//===--------------------------------------------------------------------===//