On Thu, Jun 13, 2013 at 10:45:38AM +0200, Richard Biener wrote: > On Wed, Jun 12, 2013 at 4:48 AM, Alan Modra <amo...@gmail.com> wrote: > > The following patch fixes PR57134 by > > a) excluding bitfield expansion when EXPAND_MEMORY, and > > b) passing down the EXPAND_MEMORY modifier in a couple of places where > > this does not currently happen on recursive calls to expand_expr(). > > I suppose it also fixes PR57586 which looks similar?
Not completely. It cures the ICE, but you still get "output number 0 not directly addressable". The reason being that expand_asm_operands isn't asking for a mem. It should I guess, and also not specify EXPAND_WRITE on an inout parameter. Bootstrapped and regression tested powerpc64-linux. PR middle-end/57586 * stmt.c (expand_asm_operands): Call expand_expr with EXPAND_MEMORY for output operands that disallow regs. Don't use EXPAND_WRITE on inout operands. Index: gcc/stmt.c =================================================================== --- gcc/stmt.c (revision 200083) +++ gcc/stmt.c (working copy) @@ -807,7 +807,10 @@ expand_asm_operands (tree string, tree outputs, tr || ! allows_reg || is_inout) { - op = expand_expr (val, NULL_RTX, VOIDmode, EXPAND_WRITE); + op = expand_expr (val, NULL_RTX, VOIDmode, + !allows_reg ? EXPAND_MEMORY + : !is_inout ? EXPAND_WRITE + : EXPAND_NORMAL); if (MEM_P (op)) op = validize_mem (op); > Ok with a testcase and mentioning PR57586 in the changelog. gcc.dg/compile/pr57134.c added. -- Alan Modra Australia Development Lab, IBM