From: Rafael Avila de Espindola Date: Wed, 30 Apr 2008 17:21:55 +0000 (+0000) Subject: builtins.c (fold_call_expr): Return realret. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=45e184209dbf619aab2f777064891c97e6c4b185;p=gcc.git builtins.c (fold_call_expr): Return realret. 2008-04-30 Rafael Espindola * builtins.c (fold_call_expr): Return realret. * tree-ssa-threadedge.c (record_temporary_equivalences_from_stmts_at_dest): Ignore calls to __builtin_object_size. From-SVN: r134833 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ae74e649a9b..043723e06e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-04-30 Rafael Espindola + + * builtins.c (fold_call_expr): Return realret. + * tree-ssa-threadedge.c + (record_temporary_equivalences_from_stmts_at_dest): Ignore calls to + __builtin_object_size. + 2008-04-30 Seongbae Park * gcc.c (wrapper_string): New variable. diff --git a/gcc/builtins.c b/gcc/builtins.c index 321032dace0..2cb8fa03f9e 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -10553,6 +10553,7 @@ fold_call_expr (tree exp, bool ignore) if (CAN_HAVE_LOCATION_P (realret) && !EXPR_HAS_LOCATION (realret)) SET_EXPR_LOCATION (realret, EXPR_LOCATION (exp)); + return realret; } return ret; } diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c index d0d8fb229ab..b15de2752eb 100644 --- a/gcc/tree-ssa-threadedge.c +++ b/gcc/tree-ssa-threadedge.c @@ -226,6 +226,7 @@ record_temporary_equivalences_from_stmts_at_dest (edge e, for (bsi = bsi_start (e->dest); ! bsi_end_p (bsi); bsi_next (&bsi)) { tree cached_lhs = NULL; + tree rhs; stmt = bsi_stmt (bsi); @@ -252,6 +253,32 @@ record_temporary_equivalences_from_stmts_at_dest (edge e, || TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) != SSA_NAME) continue; + rhs = GIMPLE_STMT_OPERAND (stmt, 1); + + /* The result of __builtin_object_size depends on all the arguments + of a phi node. Temporarily using only one edge produces invalid + results. For example + + if (x < 6) + goto l; + else + goto l; + + l: + r = PHI <&w[2].a[1](2), &a.a[6](3)> + __builtin_object_size (r, 0) + + The result of __builtin_object_size is defined to be the maximum of + remaining bytes. If we use only one edge on the phi, the result will + change to be the remaining bytes for the corresponding phi argument. */ + + if (TREE_CODE (rhs) == CALL_EXPR) + { + tree fndecl = get_callee_fndecl (rhs); + if (fndecl && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE) + continue; + } + /* At this point we have a statement which assigns an RHS to an SSA_VAR on the LHS. We want to try and simplify this statement to expose more context sensitive equivalences which in turn may @@ -259,10 +286,10 @@ record_temporary_equivalences_from_stmts_at_dest (edge e, Handle simple copy operations as well as implied copies from ASSERT_EXPRs. */ - if (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == SSA_NAME) - cached_lhs = GIMPLE_STMT_OPERAND (stmt, 1); - else if (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == ASSERT_EXPR) - cached_lhs = TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0); + if (TREE_CODE (rhs) == SSA_NAME) + cached_lhs = rhs; + else if (TREE_CODE (rhs) == ASSERT_EXPR) + cached_lhs = TREE_OPERAND (rhs, 0); else { /* A statement that is not a trivial copy or ASSERT_EXPR.