[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