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) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits