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

Reply via email to