This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR80222
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 28 Mar 2017 12:08:50 +0200 (CEST)
- Subject: [PATCH] Fix PR80222
- Authentication-results: sourceware.org; auth=none
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 <rguenther@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" } } */