On Thu, Mar 03, 2011 at 03:31:55PM +1000, Richard Henderson wrote: > Do you really want to fallthru with newexp here? > In theory it could have folded to anything. My guess is that > you want to restart instead...
Here is an updated patch that does that, and also as requested by Richard Guenther instead of calling set_mem_expr with a type just clears MEM_EXPR if it isn't suitable for alias oracle. Bootstrapped/regtested again on x86_64-linux and i686-linux, ok? 2011-03-03 Jakub Jelinek <ja...@redhat.com> PR debug/47283 * cfgexpand.c (expand_debug_expr) <case MEM_REF>: If MEM_REF first operand is not is_gimple_mem_ref_addr, try to fold it. If the operand still isn't is_gimple_mem_ref_addr, clear MEM_EXPR on op0. --- gcc/cfgexpand.c.jj 2011-02-21 15:37:42.000000000 +0100 +++ gcc/cfgexpand.c 2011-03-02 11:05:32.000000000 +0100 @@ -2578,6 +2578,15 @@ expand_debug_expr (tree exp) } case MEM_REF: + if (!is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) + { + tree newexp = fold_binary (MEM_REF, TREE_TYPE (exp), + TREE_OPERAND (exp, 0), + TREE_OPERAND (exp, 1)); + if (newexp) + return expand_debug_expr (newexp); + } + /* FALLTHROUGH */ case INDIRECT_REF: op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); if (!op0) @@ -2611,6 +2620,9 @@ expand_debug_expr (tree exp) op0 = gen_rtx_MEM (mode, op0); set_mem_attributes (op0, exp, 0); + if (TREE_CODE (exp) == MEM_REF + && !is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) + set_mem_expr (op0, NULL_TREE); set_mem_addr_space (op0, as); return op0; Jakub