[llvm-commits] [gcc-plugin] r81712 - in /gcc-plugin/trunk: llvm-convert.cpp llvm-internal.h

Duncan Sands baldrick at free.fr
Sun Sep 13 13:25:45 PDT 2009


Author: baldrick
Date: Sun Sep 13 15:25:44 2009
New Revision: 81712

URL: http://llvm.org/viewvc/llvm-project?rev=81712&view=rev
Log:
Handle gimple return statements directly, rather than going via a tree.

Modified:
    gcc-plugin/trunk/llvm-convert.cpp
    gcc-plugin/trunk/llvm-internal.h

Modified: gcc-plugin/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/gcc-plugin/trunk/llvm-convert.cpp?rev=81712&r1=81711&r2=81712&view=diff

==============================================================================
--- gcc-plugin/trunk/llvm-convert.cpp (original)
+++ gcc-plugin/trunk/llvm-convert.cpp Sun Sep 13 15:25:44 2009
@@ -949,7 +949,6 @@
 
     switch (gimple_code(gimple_stmt)) {
     case GIMPLE_ASSIGN:
-    case GIMPLE_RETURN:
     case GIMPLE_ASM:
     case GIMPLE_CALL:
     case GIMPLE_RESX: {
@@ -983,6 +982,10 @@
     case GIMPLE_PREDICT:
       break;
 
+    case GIMPLE_RETURN:
+      RenderGIMPLE_RETURN(gimple_stmt);
+      break;
+
     case GIMPLE_SWITCH:
       RenderGIMPLE_SWITCH(gimple_stmt);
       break;
@@ -1050,10 +1053,6 @@
     debug_tree(exp);
     llvm_unreachable("Unhandled expression!");
 
-  // Control flow
-  case LABEL_EXPR:  break;
-  case RETURN_EXPR: Result = EmitRETURN_EXPR(exp, DestLoc); break;
-
   // Exception handling.
   case EXC_PTR_EXPR:   Result = EmitEXC_PTR_EXPR(exp); break;
   case FILTER_EXPR:    Result = EmitFILTER_EXPR(exp); break;
@@ -1912,26 +1911,6 @@
 //                           ... Control Flow ...
 //===----------------------------------------------------------------------===//
 
-Value *TreeToLLVM::EmitRETURN_EXPR(tree exp, const MemRef *DestLoc) {
-  assert(DestLoc == 0 && "Does not return a value!");
-  tree retval = TREE_OPERAND(exp, 0);
-
-  assert((!retval || TREE_CODE(retval) == RESULT_DECL ||
-          ((TREE_CODE(retval) == MODIFY_EXPR
-             || TREE_CODE(retval) == INIT_EXPR) &&
-           TREE_CODE(TREE_OPERAND(retval, 0)) == RESULT_DECL)) &&
-         "RETURN_EXPR not gimple!");
-
-  if (retval && TREE_CODE(retval) != RESULT_DECL)
-    // Emit the assignment to RESULT_DECL.
-    Emit(retval, 0);
-
-  // Emit a branch to the exit label.
-  Builder.CreateBr(ReturnBB);
-  EmitBlock(BasicBlock::Create(Context));
-  return 0;
-}
-
 /// CreateExceptionValues - Create values used internally by exception handling.
 void TreeToLLVM::CreateExceptionValues() {
   // Check to see if the exception values have been constructed.
@@ -8074,6 +8053,26 @@
   Builder.CreateBr(DestBB);
 }
 
+void TreeToLLVM::RenderGIMPLE_RETURN(gimple stmt) {
+  tree retval = gimple_return_retval(stmt);
+  tree result = DECL_RESULT(current_function_decl);
+
+  if (retval && retval != error_mark_node && retval != result) {
+    // Store the return value to the function's DECL_RESULT.
+    if (isAggregateTreeType(TREE_TYPE(result))) {
+      MemRef DestLoc(DECL_LLVM(result), 1, false); // FIXME: What alignment?
+      Emit(retval, &DestLoc);
+    } else {
+      Value *Val = Builder.CreateBitCast(Emit(retval, 0),
+                                         ConvertType(TREE_TYPE(result)));
+      Builder.CreateStore(Val, DECL_LLVM(result));
+    }
+  }
+
+  // Emit a branch to the exit label.
+  Builder.CreateBr(ReturnBB);
+}
+
 void TreeToLLVM::RenderGIMPLE_SWITCH(gimple stmt) {
   // Emit the condition.
   Value *Index = Emit(gimple_switch_index(stmt), 0);

Modified: gcc-plugin/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/gcc-plugin/trunk/llvm-internal.h?rev=81712&r1=81711&r2=81712&view=diff

==============================================================================
--- gcc-plugin/trunk/llvm-internal.h (original)
+++ gcc-plugin/trunk/llvm-internal.h Sun Sep 13 15:25:44 2009
@@ -520,6 +520,7 @@
   // Render* - Convert GIMPLE to LLVM.
   void RenderGIMPLE_COND(gimple_statement_d *);
   void RenderGIMPLE_GOTO(gimple_statement_d *);
+  void RenderGIMPLE_RETURN(gimple_statement_d *);
   void RenderGIMPLE_SWITCH(gimple_statement_d *);
 
 private:
@@ -541,9 +542,6 @@
   // Emit* - These are delegates from Emit, and have the same parameter
   // characteristics.
 
-  // Control flow.
-  Value *EmitRETURN_EXPR(tree_node *exp, const MemRef *DestLoc);
-
   // Expressions.
   Value *EmitSSA_NAME(tree_node *exp);
   Value *EmitLoadOfLValue(tree_node *exp, const MemRef *DestLoc);





More information about the llvm-commits mailing list