Commit 502c4bb9 by Eric Botcazou Committed by Eric Botcazou

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
parent d4aa4f4b
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> 2009-06-19 Emmanuel Briot <briot@adacore.com>
* prj-ext.adb, makeutl.adb, makeutl.ads (Executable_Prefix_Path): Now * prj-ext.adb, makeutl.adb, makeutl.ads (Executable_Prefix_Path): Now
......
...@@ -6610,10 +6610,7 @@ emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node) ...@@ -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. */ we don't need to evaluate it just for the check. */
TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr); TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr);
/* ??? Unfortunately, if we don't put a SAVE_EXPR around this whole thing, return gnu_result;
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 an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow /* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow
...@@ -7229,8 +7226,15 @@ protect_multiple_eval (tree exp) ...@@ -7229,8 +7226,15 @@ protect_multiple_eval (tree exp)
{ {
tree type = TREE_TYPE (exp); tree type = TREE_TYPE (exp);
/* If this has no side effects, we don't need to do anything. */ /* If EXP has no side effects, we theoritically don't need to do anything.
if (!TREE_SIDE_EFFECTS (exp)) 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; return exp;
/* If this is a conversion, protect what's inside the conversion. /* If this is a conversion, protect what's inside the conversion.
......
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