OSDN Git Service

2010-04-07 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Apr 2010 10:15:05 +0000 (10:15 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Apr 2010 10:15:05 +0000 (10:15 +0000)
PR middle-end/42617
* expr.c (expand_expr_real_1): For TARGET_MEM_REFs with
pointer bases build simple mem attributes to retain
points-to information.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158048 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c

index 4c9b75a..b4aa73e 100644 (file)
@@ -1,6 +1,13 @@
 2010-04-07  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/42617
+       * expr.c (expand_expr_real_1): For TARGET_MEM_REFs with
+       pointer bases build simple mem attributes to retain
+       points-to information.
+
+2010-04-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/42617
        * alias.c (ao_ref_from_mem): Without MEM_OFFSET or MEM_SIZE
        preserve points-to related information.
 
index ad66d93..1f04ffb 100644 (file)
@@ -8730,6 +8730,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       {
        addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
        struct mem_address addr;
+       tree base;
 
        get_address_description (exp, &addr);
        op0 = addr_for_mem_ref (&addr, as, true);
@@ -8737,6 +8738,16 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
        temp = gen_rtx_MEM (mode, op0);
        set_mem_attributes (temp, TMR_ORIGINAL (exp), 0);
        set_mem_addr_space (temp, as);
+       base = get_base_address (TMR_ORIGINAL (exp));
+       if (INDIRECT_REF_P (base)
+           && TMR_BASE (exp)
+           && TREE_CODE (TMR_BASE (exp)) == SSA_NAME
+           && POINTER_TYPE_P (TREE_TYPE (TMR_BASE (exp))))
+         {
+           set_mem_expr (temp, build1 (INDIRECT_REF,
+                                       TREE_TYPE (exp), TMR_BASE (exp)));
+           set_mem_offset (temp, NULL_RTX);
+         }
       }
       return temp;