OSDN Git Service

* gcc-interface/trans.c (emit_check): Do not wrap up the result
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Jun 2009 18:18:54 +0000 (18:18 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Jun 2009 18:18:54 +0000 (18:18 +0000)
in a SAVE_EXPR.
(protect_multiple_eval): Always protect complex expressions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148723 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index 194ac37..b03304f 100644 (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
index b59af8c..ed9337c 100644 (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;
 }
 \f
 /* 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.