[llvm-commits] [llvm-gcc-4.2] r41183 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Duncan Sands
baldrick at free.fr
Mon Aug 20 10:04:56 PDT 2007
Author: baldrick
Date: Mon Aug 20 12:04:56 2007
New Revision: 41183
URL: http://llvm.org/viewvc/llvm-project?rev=41183&view=rev
Log:
Rather than calling disband_implicit_edges (which does
a bunch of things we don't need), handle fall-through
edges directly.
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=41183&r1=41182&r2=41183&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Mon Aug 20 12:04:56 2007
@@ -382,6 +382,22 @@
TheTreeToLLVM = 0;
}
+/// getLabelDeclBlock - Lazily get and create a basic block for the specified
+/// label.
+static BasicBlock *getLabelDeclBlock(tree LabelDecl) {
+ assert(TREE_CODE(LabelDecl) == LABEL_DECL && "Isn't a label!?");
+ if (DECL_LLVM_SET_P(LabelDecl))
+ return cast<BasicBlock>(DECL_LLVM(LabelDecl));
+
+ const char *Name = "bb";
+ if (DECL_NAME(LabelDecl))
+ Name = IDENTIFIER_POINTER(DECL_NAME(LabelDecl));
+
+ BasicBlock *NewBB = new BasicBlock(Name);
+ SET_DECL_LLVM(LabelDecl, NewBB);
+ return NewBB;
+}
+
namespace {
/// FunctionPrologArgumentConversion - This helper class is driven by the ABI
/// definition for this target to figure out how to retrieve arguments from
@@ -757,15 +773,23 @@
// Set up parameters and prepare for return, for the function.
StartFunctionBody();
- // Drop all fallthru edges, make explicit jumps
- disband_implicit_edges();
-
// Emit the body of the function iterating over all BBs
basic_block bb;
- FOR_EACH_BB (bb)
+ edge e;
+ edge_iterator ei;
+ FOR_EACH_BB (bb) {
for (block_stmt_iterator bsi = bsi_start (bb); !bsi_end_p (bsi);
bsi_next (&bsi))
EmitStatement(bsi_stmt (bsi));
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (e->flags & EDGE_FALLTHRU)
+ break;
+ if (e && e->dest != bb->next_bb) {
+ Builder.CreateBr(getLabelDeclBlock(tree_block_label (e->dest)));
+ EmitBlock(new BasicBlock(""));
+ }
+ }
// Wrap things up.
return FinishFunctionBody();
@@ -1617,22 +1641,6 @@
// ... Control Flow ...
//===----------------------------------------------------------------------===//
-/// getLabelDeclBlock - Lazily get and create a basic block for the specified
-/// label.
-static BasicBlock *getLabelDeclBlock(tree LabelDecl) {
- assert(TREE_CODE(LabelDecl) == LABEL_DECL && "Isn't a label!?");
- if (DECL_LLVM_SET_P(LabelDecl))
- return cast<BasicBlock>(DECL_LLVM(LabelDecl));
-
- const char *Name = "bb";
- if (DECL_NAME(LabelDecl))
- Name = IDENTIFIER_POINTER(DECL_NAME(LabelDecl));
-
- BasicBlock *NewBB = new BasicBlock(Name);
- SET_DECL_LLVM(LabelDecl, NewBB);
- return NewBB;
-}
-
/// EmitLABEL_EXPR - Emit the basic block corresponding to the specified label.
///
Value *TreeToLLVM::EmitLABEL_EXPR(tree exp) {
More information about the llvm-commits
mailing list