gimplify.c (gimplify_modify_expr_rhs): Don't return GS_OK for stripping WITH_SIZE_EXPR.
authorJason Merrill <jason@redhat.com>
Thu, 6 May 2010 19:46:03 +0000 (15:46 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 6 May 2010 19:46:03 +0000 (15:46 -0400)
* gimplify.c (gimplify_modify_expr_rhs): Don't return GS_OK for
stripping WITH_SIZE_EXPR.
(gimplify_expr) [MODIFY_EXPR]: Trust GS_OK even if the rhs didn't
change.

From-SVN: r159124

gcc/ChangeLog
gcc/gimplify.c

index 777f08a2edbedd3779f5287b8a4b80777caf28b3..a7595478ecb2fddd4100ff7f5fbaa90b26475141 100644 (file)
@@ -1,3 +1,10 @@
+2010-05-06  Jason Merrill  <jason@redhat.com>
+
+       * gimplify.c (gimplify_modify_expr_rhs): Don't return GS_OK for
+       stripping WITH_SIZE_EXPR.
+       (gimplify_expr) [MODIFY_EXPR]: Trust GS_OK even if the rhs didn't
+       change.
+
 2010-05-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * config.gcc: Removed mips-sgi-irix5*, mips-sgi-irix6.[0-4]* from
index 8d2bc582a7a8fae29e55eacbdc636f70aae5b01c..51ec4b5633d2e5ba6eeb66c4016dcc40dc6556c4 100644 (file)
@@ -4291,7 +4291,10 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
          if (TREE_CODE (TREE_OPERAND (*from_p, 0)) == CALL_EXPR)
            {
              *from_p = TREE_OPERAND (*from_p, 0);
-             ret = GS_OK;
+             /* We don't change ret in this case because the
+                WITH_SIZE_EXPR might have been added in
+                gimplify_modify_expr, so returning GS_OK would lead to an
+                infinite loop.  */
              changed = true;
            }
          break;
@@ -6628,16 +6631,12 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
 
        case MODIFY_EXPR:
        case INIT_EXPR:
-         {
-           tree from = TREE_OPERAND (*expr_p, 1);
-           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
-                                       fallback != fb_none);
-           /* Don't let the end of loop logic change GS_OK into GS_ALL_DONE
-              if the RHS has changed.  */
-           if (ret == GS_OK && *expr_p == save_expr
-               && TREE_OPERAND (*expr_p, 1) != from)
-             continue;
-         }
+         ret = gimplify_modify_expr (expr_p, pre_p, post_p,
+                                     fallback != fb_none);
+         /* Don't let the end of loop logic change GS_OK to GS_ALL_DONE;
+            gimplify_modify_expr_rhs might have changed the RHS.  */
+         if (ret == GS_OK && *expr_p)
+           continue;
          break;
 
        case TRUTH_ANDIF_EXPR: