aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2009-06-19 18:18:54 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2009-06-19 18:18:54 +0000
commit502c4bb950b3f5f0b1089800123acadf595e12b4 (patch)
tree866ee4024661709e4c172685223da255f18a8114 /gcc
parentd4aa4f4b78fd35f3005943ee7a59468660504337 (diff)
downloadgcc-502c4bb950b3f5f0b1089800123acadf595e12b4.zip
gcc-502c4bb950b3f5f0b1089800123acadf595e12b4.tar.gz
gcc-502c4bb950b3f5f0b1089800123acadf595e12b4.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c16
2 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 194ac37..b03304f 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index b59af8c..ed9337c 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -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.