In the context of PR79671 it was noticed that forcing a ref-all
pointer access via a simple static_cast <C&> (obj) and C
with may_alias on it didn't work.

But it should.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2017-03-28  Richard Biener  <rguent...@suse.de>

        PR middle-end/80222
        * gimple-fold.c (gimple_fold_indirect_ref): Do not touch
        TYPE_REF_CAN_ALIAS_ALL references.
        * fold-const.c (fold_indirect_ref_1): Likewise.

        * g++.dg/pr80222.C: New testcase.

Index: gcc/gimple-fold.c
===================================================================
*** gcc/gimple-fold.c   (revision 246500)
--- gcc/gimple-fold.c   (working copy)
*************** gimple_get_virt_method_for_binfo (HOST_W
*** 6539,6546 ****
    return gimple_get_virt_method_for_vtable (token, v, offset, can_refer);
  }
  
! /* Given a pointer value OP0, return a simplified version of an
!    indirection through OP0, or NULL_TREE if no simplification is
     possible.  Note that the resulting type may be different from
     the type pointed to in the sense that it is still compatible
     from the langhooks point of view. */
--- 6539,6546 ----
    return gimple_get_virt_method_for_vtable (token, v, offset, can_refer);
  }
  
! /* Given a pointer value T, return a simplified version of an
!    indirection through T, or NULL_TREE if no simplification is
     possible.  Note that the resulting type may be different from
     the type pointed to in the sense that it is still compatible
     from the langhooks point of view. */
*************** gimple_fold_indirect_ref (tree t)
*** 6554,6560 ****
  
    STRIP_NOPS (sub);
    subtype = TREE_TYPE (sub);
!   if (!POINTER_TYPE_P (subtype))
      return NULL_TREE;
  
    if (TREE_CODE (sub) == ADDR_EXPR)
--- 6554,6561 ----
  
    STRIP_NOPS (sub);
    subtype = TREE_TYPE (sub);
!   if (!POINTER_TYPE_P (subtype)
!       || TYPE_REF_CAN_ALIAS_ALL (ptype))
      return NULL_TREE;
  
    if (TREE_CODE (sub) == ADDR_EXPR)
Index: gcc/fold-const.c
===================================================================
*** gcc/fold-const.c    (revision 246500)
--- gcc/fold-const.c    (working copy)
*************** fold_indirect_ref_1 (location_t loc, tre
*** 14006,14012 ****
  
    STRIP_NOPS (sub);
    subtype = TREE_TYPE (sub);
!   if (!POINTER_TYPE_P (subtype))
      return NULL_TREE;
  
    if (TREE_CODE (sub) == ADDR_EXPR)
--- 14006,14013 ----
  
    STRIP_NOPS (sub);
    subtype = TREE_TYPE (sub);
!   if (!POINTER_TYPE_P (subtype)
!       || TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (op0)))
      return NULL_TREE;
  
    if (TREE_CODE (sub) == ADDR_EXPR)
Index: gcc/testsuite/g++.dg/pr80222.C
===================================================================
*** gcc/testsuite/g++.dg/pr80222.C      (nonexistent)
--- gcc/testsuite/g++.dg/pr80222.C      (working copy)
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile }
+ // { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ struct C { int i; }__attribute__((may_alias)) ;
+ 
+ C a, b;
+ 
+ int main()
+ {
+   a = static_cast <C&> (b);
+ }
+ 
+ // { dg-final { scan-tree-dump "{ref-all}\\\)&b\];" "optimized" } } */

Reply via email to