[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