trans.c (emit_check): Do not wrap up the result in a SAVE_EXPR.

* gcc-interface/trans.c (emit_check): Do not wrap up the result
	in a SAVE_EXPR.
	(protect_multiple_eval): Always protect complex expressions.

From-SVN: r148723
This commit is contained in:
Eric Botcazou 2009-06-19 18:18:54 +00:00 committed by Eric Botcazou
parent d4aa4f4b78
commit 502c4bb950
2 changed files with 16 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2009-06-19 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (emit_check): Do not wrap up the result
in a SAVE_EXPR.
(protect_multiple_eval): Always protect complex expressions.
2009-06-19 Emmanuel Briot <briot@adacore.com>
* prj-ext.adb, makeutl.adb, makeutl.ads (Executable_Prefix_Path): Now

View File

@ -6610,10 +6610,7 @@ emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node)
we don't need to evaluate it just for the check. */
TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr);
/* ??? Unfortunately, if we don't put a SAVE_EXPR around this whole thing,
we will repeatedly do the test and, at compile time, we will repeatedly
visit it during unsharing, which leads to an exponential explosion. */
return save_expr (gnu_result);
return gnu_result;
}
/* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow
@ -7229,8 +7226,15 @@ protect_multiple_eval (tree exp)
{
tree type = TREE_TYPE (exp);
/* If this has no side effects, we don't need to do anything. */
if (!TREE_SIDE_EFFECTS (exp))
/* If EXP has no side effects, we theoritically don't need to do anything.
However, we may be recursively passed more and more complex expressions
involving checks which will be reused multiple times and eventually be
unshared for gimplification; in order to avoid a complexity explosion
at that point, we protect any expressions more complex than a simple
arithmetic expression. */
if (!TREE_SIDE_EFFECTS (exp)
&& (CONSTANT_CLASS_P (exp)
|| !EXPRESSION_CLASS_P (skip_simple_arithmetic (exp))))
return exp;
/* If this is a conversion, protect what's inside the conversion.