From 0e256a822b855ecae6b5ef593b30a7e2e522e6d1 Mon Sep 17 00:00:00 2001
From: Andrew Pinski <pinskia@physics.uc.edu>
Date: Tue, 28 Dec 2004 15:56:51 +0000
Subject: [PATCH] fold-const.c (fold_build_cleanup_point_expr): For a
 RETURN_EXPR...

2004-12-28  Andrew Pinski  <pinskia@physics.uc.edu>

        * fold-const.c (fold_build_cleanup_point_expr): For a RETURN_EXPR,
        we only need a cleanup point expression when the expression on the
        left hand side of the MODIFIY_EXPR inside the return has side
        effects.

From-SVN: r92672
---
 gcc/ChangeLog    |  7 +++++++
 gcc/fold-const.c | 15 +++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index af19fd89d5d2..ba2abe3d67d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-28  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	* fold-const.c (fold_build_cleanup_point_expr): For a RETURN_EXPR,
+	we only need a cleanup point expression when the expression on the
+	left hand side of the MODIFIY_EXPR inside the return has side
+	effects.
+
 2004-12-28  Dorit Naishlos  <dorit@il.ibm.com>
 
 	* tree-vectorizer.c (vect_mark_relevant) First argument changed from
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 8f8624cf5994..5006998352c6 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -10783,6 +10783,21 @@ fold_build_cleanup_point_expr (tree type, tree expr)
      it with a cleanup point expression.  */
   if (!TREE_SIDE_EFFECTS (expr))
     return expr;
+
+  /* If the expression is a return, check to see if the expression inside the
+     return has no side effects or the right hand side of the modify expression
+     inside the return. If either don't have side effects set we don't need to
+     wrap the expression in a cleanup point expression.  Note we don't check the
+     left hand side of the modify because it should always be a return decl.  */
+  if (TREE_CODE (expr) == RETURN_EXPR)
+    {
+      tree op = TREE_OPERAND (expr, 0);
+      if (!op || !TREE_SIDE_EFFECTS (op))
+        return expr;
+      op = TREE_OPERAND (op, 1);
+      if (!TREE_SIDE_EFFECTS (op))
+        return expr;
+    }
   
   return build1 (CLEANUP_POINT_EXPR, type, expr);
 }
-- 
GitLab