From: Jason Merrill Date: Thu, 6 May 2010 19:46:03 +0000 (-0400) Subject: gimplify.c (gimplify_modify_expr_rhs): Don't return GS_OK for stripping WITH_SIZE_EXPR. X-Git-Tag: releases/gcc-4.6.0~7449 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebad523301c12f27e56a3008916e4e41f518ba57;p=thirdparty%2Fgcc.git gimplify.c (gimplify_modify_expr_rhs): Don't return GS_OK for stripping WITH_SIZE_EXPR. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 777f08a2edbe..a7595478ecb2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-05-06 Jason Merrill + + * 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 * config.gcc: Removed mips-sgi-irix5*, mips-sgi-irix6.[0-4]* from diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 8d2bc582a7a8..51ec4b5633d2 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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: