Commit 45e18420 by Rafael Avila de Espindola Committed by Rafael Espindola

builtins.c (fold_call_expr): Return realret.

2008-04-30  Rafael Espindola  <espindola@google.com>

	* 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
parent fe7df9c4
2008-04-30 Rafael Espindola <espindola@google.com>
* 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 <seongbae.park@gmail.com> 2008-04-30 Seongbae Park <seongbae.park@gmail.com>
* gcc.c (wrapper_string): New variable. * gcc.c (wrapper_string): New variable.
......
...@@ -10553,6 +10553,7 @@ fold_call_expr (tree exp, bool ignore) ...@@ -10553,6 +10553,7 @@ fold_call_expr (tree exp, bool ignore)
if (CAN_HAVE_LOCATION_P (realret) if (CAN_HAVE_LOCATION_P (realret)
&& !EXPR_HAS_LOCATION (realret)) && !EXPR_HAS_LOCATION (realret))
SET_EXPR_LOCATION (realret, EXPR_LOCATION (exp)); SET_EXPR_LOCATION (realret, EXPR_LOCATION (exp));
return realret;
} }
return ret; return ret;
} }
......
...@@ -226,6 +226,7 @@ record_temporary_equivalences_from_stmts_at_dest (edge e, ...@@ -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)) for (bsi = bsi_start (e->dest); ! bsi_end_p (bsi); bsi_next (&bsi))
{ {
tree cached_lhs = NULL; tree cached_lhs = NULL;
tree rhs;
stmt = bsi_stmt (bsi); stmt = bsi_stmt (bsi);
...@@ -252,6 +253,32 @@ record_temporary_equivalences_from_stmts_at_dest (edge e, ...@@ -252,6 +253,32 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
|| TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) != SSA_NAME) || TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) != SSA_NAME)
continue; 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 /* 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 SSA_VAR on the LHS. We want to try and simplify this statement
to expose more context sensitive equivalences which in turn may to expose more context sensitive equivalences which in turn may
...@@ -259,10 +286,10 @@ record_temporary_equivalences_from_stmts_at_dest (edge e, ...@@ -259,10 +286,10 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
Handle simple copy operations as well as implied copies from Handle simple copy operations as well as implied copies from
ASSERT_EXPRs. */ ASSERT_EXPRs. */
if (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == SSA_NAME) if (TREE_CODE (rhs) == SSA_NAME)
cached_lhs = GIMPLE_STMT_OPERAND (stmt, 1); cached_lhs = rhs;
else if (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == ASSERT_EXPR) else if (TREE_CODE (rhs) == ASSERT_EXPR)
cached_lhs = TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0); cached_lhs = TREE_OPERAND (rhs, 0);
else else
{ {
/* A statement that is not a trivial copy or ASSERT_EXPR. /* A statement that is not a trivial copy or ASSERT_EXPR.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment