This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] expand_expr EXPAND_NORMAL modifer when recursing (PR middle-end/29250)

	When expanding an INDIRECT_REF, GCC invokes expand_expr with
modifier EXPAND_SUM, allowing a PLUS or MULT in the RTL handed to
memory_address, which handles validation.  However, this same modifier
currently is passed to recursive expand_expr calls for interior
expressions.  This can lead to generation of invalid RTL.  For the case of
the PR, expansion travels down a path that does no validation or predicate
checking and eventually creates raw RTL representing the expression.

	Through discussions with Ian, he and I created the appended patch
that intercepts EXPAND_SUM modifier at CONVERT_EXPR and NOP_EXPR and
recurses with the modifier changed to EXPAND_NORMAL.

Bootstrapped and regression tested on powerpc-ibm-aix5.2.0.0.

Okay for mainline?

Thanks, David

: ADDPATCH middle-end :

2006-10-13  David Edelsohn  <>
	    Ian Lance Taylor  <>

	PR middle-end/29250
	* expr.c (expand_expr_real_1) <NON_LVALUE_EXPR, NOP_EXPR,

Index: expr.c
*** expr.c	(revision 117682)
--- expr.c	(working copy)
*************** expand_expr_real_1 (tree exp, rtx target
*** 7739,7745 ****
  	  return REDUCE_BIT_FIELD (op0);
!       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
        if (GET_MODE (op0) == mode)
--- 7739,7746 ----
  	  return REDUCE_BIT_FIELD (op0);
!       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode,
! 			 modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
        if (GET_MODE (op0) == mode)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]