diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cfgexpand.c | 12 |
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e40f40e435c..5d524d50f9a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-03-03 Jakub Jelinek <jakub@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. + 2011-03-03 Richard Guenther <rguenther@suse.de> PR middle-end/47283 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index ecfd1a50f39..059c5b2725c 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -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; |