Commit d62887a4 by Richard Biener Committed by Richard Biener

re PR fortran/90738 (gfortran.dg/pointer_array_10.f90 etc. FAIL)

2019-06-04  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/90738
	Revert
	2019-06-03  Richard Biener  <rguenther@suse.de>

	* tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Get original
	full reference tree and record in ref->ref.
	(vn_reference_lookup_3): Pass in original ref to
	ao_ref_init_from_vn_reference.
	(vn_reference_lookup): Likewise.
	* tree-ssa-sccvn.h (ao_ref_init_from_vn_reference): Adjust prototype.
	* tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
	Handle non-decl bases in the original reference.

	* gcc.dg/tree-ssa/alias-access-path-1.c: Scan fre1.

	* gcc.dg/torture/pr90738.c: New testcase.

From-SVN: r271902
parent c3af5442
2019-06-04 Richard Biener <rguenther@suse.de>
PR tree-optimization/90738
Revert
2019-06-03 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Get original
full reference tree and record in ref->ref.
(vn_reference_lookup_3): Pass in original ref to
ao_ref_init_from_vn_reference.
(vn_reference_lookup): Likewise.
* tree-ssa-sccvn.h (ao_ref_init_from_vn_reference): Adjust prototype.
* tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
Handle non-decl bases in the original reference.
2019-06-04 Martin Liska <mliska@suse.cz> 2019-06-04 Martin Liska <mliska@suse.cz>
* ipa-icf.c (sem_item_optimizer::add_item_to_class): Count * ipa-icf.c (sem_item_optimizer::add_item_to_class): Count
......
2019-06-04 Richard Biener <rguenther@suse.de>
PR tree-optimization/90738
* gcc.dg/torture/pr90738.c: New testcase.
Revert
2019-06-03 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/alias-access-path-1.c: Scan fre1.
2019-06-04 Martin Liska <mliska@suse.cz> 2019-06-04 Martin Liska <mliska@suse.cz>
* c-c++-common/goacc/acc-icf.c: Change scanned pattern. * c-c++-common/goacc/acc-icf.c: Change scanned pattern.
......
/* { dg-do run } */
int __attribute__((noipa,noinline))
foo (int i)
{
int a[2];
a[1] = 1;
int j = a[1];
int *p = &a[0];
p[i] = 0;
return a[j];
}
int
main()
{
if (foo (1) != 0)
__builtin_abort ();
return 0;
}
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-fre1 -fno-tree-sra" } */ /* { dg-options "-O2 -fdump-tree-fre3 -fno-tree-sra" } */
struct foo struct foo
{ {
int val; int val;
...@@ -19,4 +18,4 @@ test () ...@@ -19,4 +18,4 @@ test ()
return barptr->val2; return barptr->val2;
} }
/* { dg-final { scan-tree-dump-times "return 123" 1 "fre1"} } */ /* { dg-final { scan-tree-dump-times "return 123" 1 "fre3"} } */
...@@ -1013,8 +1013,7 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2) ...@@ -1013,8 +1013,7 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
} }
if (TREE_CODE (ref1) == MEM_REF) if (TREE_CODE (ref1) == MEM_REF)
{ {
if (!integer_zerop (TREE_OPERAND (ref1, 1)) if (!integer_zerop (TREE_OPERAND (ref1, 1)))
|| TREE_CODE (TREE_OPERAND (ref1, 0)) != ADDR_EXPR)
return false; return false;
ref1 = TREE_OPERAND (TREE_OPERAND (ref1, 0), 0); ref1 = TREE_OPERAND (TREE_OPERAND (ref1, 0), 0);
} }
...@@ -1027,8 +1026,7 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2) ...@@ -1027,8 +1026,7 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
} }
if (TREE_CODE (ref2) == MEM_REF) if (TREE_CODE (ref2) == MEM_REF)
{ {
if (!integer_zerop (TREE_OPERAND (ref2, 1)) if (!integer_zerop (TREE_OPERAND (ref2, 1)))
|| TREE_CODE (TREE_OPERAND (ref2, 0)) != ADDR_EXPR)
return false; return false;
ref2 = TREE_OPERAND (TREE_OPERAND (ref2, 0), 0); ref2 = TREE_OPERAND (TREE_OPERAND (ref2, 0), 0);
} }
......
...@@ -995,7 +995,7 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result) ...@@ -995,7 +995,7 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result)
bool bool
ao_ref_init_from_vn_reference (ao_ref *ref, ao_ref_init_from_vn_reference (ao_ref *ref,
alias_set_type set, tree type, alias_set_type set, tree type,
vec<vn_reference_op_s> ops, tree orig_ref) vec<vn_reference_op_s> ops)
{ {
vn_reference_op_t op; vn_reference_op_t op;
unsigned i; unsigned i;
...@@ -1149,7 +1149,7 @@ ao_ref_init_from_vn_reference (ao_ref *ref, ...@@ -1149,7 +1149,7 @@ ao_ref_init_from_vn_reference (ao_ref *ref,
if (base == NULL_TREE) if (base == NULL_TREE)
return false; return false;
ref->ref = orig_ref; ref->ref = NULL_TREE;
ref->base = base; ref->base = base;
ref->ref_alias_set = set; ref->ref_alias_set = set;
if (base_alias_set != -1) if (base_alias_set != -1)
...@@ -1976,8 +1976,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, ...@@ -1976,8 +1976,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
{ {
lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref, lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref,
get_alias_set (lhs), get_alias_set (lhs),
TREE_TYPE (lhs), lhs_ops, TREE_TYPE (lhs), lhs_ops);
lhs);
if (lhs_ref_ok if (lhs_ref_ok
&& !refs_may_alias_p_1 (ref, &lhs_ref, true)) && !refs_may_alias_p_1 (ref, &lhs_ref, true))
{ {
...@@ -2719,7 +2718,7 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind, ...@@ -2719,7 +2718,7 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
Otherwise preserve the full reference for advanced TBAA. */ Otherwise preserve the full reference for advanced TBAA. */
if (!valuezied_anything if (!valuezied_anything
|| !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type, || !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type,
vr1.operands, op)) vr1.operands))
ao_ref_init (&r, op); ao_ref_init (&r, op);
if (! tbaa_p) if (! tbaa_p)
r.ref_alias_set = r.base_alias_set = 0; r.ref_alias_set = r.base_alias_set = 0;
......
...@@ -229,7 +229,7 @@ vn_nary_op_t vn_nary_op_insert (tree, tree); ...@@ -229,7 +229,7 @@ vn_nary_op_t vn_nary_op_insert (tree, tree);
vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code, vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code,
tree, tree *, tree, unsigned int); tree, tree *, tree, unsigned int);
bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree, bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree,
vec<vn_reference_op_s>, tree = NULL_TREE); vec<vn_reference_op_s> );
vec<vn_reference_op_s> vn_reference_operands_for_lookup (tree); vec<vn_reference_op_s> vn_reference_operands_for_lookup (tree);
tree vn_reference_lookup_pieces (tree, alias_set_type, tree, tree vn_reference_lookup_pieces (tree, alias_set_type, tree,
vec<vn_reference_op_s> , vec<vn_reference_op_s> ,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment