diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d4af4e1bd3ac25ea3872b9377409f0377bd5379d..6c9fa11ccf8d5d08fad9fba73628fe8433e32668 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2006-10-13  David Edelsohn  <edelsohn@gnu.org>
+	    Ian Lance Taylor  <ian@airs.com>
+
+	PR middle-end/29250
+	* expr.c (expand_expr_real_1) <NON_LVALUE_EXPR, NOP_EXPR,
+	CONVERT_EXPR>: Change EXPAND_SUM modifier to EXPAND_NORMAL when
+	recursing.
+
 2006-10-14  Kazu Hirata  <kazu@codesourcery.com>
 
 	* config/score/score.c, config/score/score.h: Fix comment
diff --git a/gcc/expr.c b/gcc/expr.c
index a0dc9c360f08fffa55629f1b9b1ef9560a0171d5..50564b650720c03c467b505c9b5fad42d617663e 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7739,7 +7739,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 	  return REDUCE_BIT_FIELD (op0);
 	}
 
-      op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
+      op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode,
+			 modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
       if (GET_MODE (op0) == mode)
 	;